Single型の使用頻度。

フリートーク
返信する
メッセージ
作成者
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

Single型の使用頻度。

#1 投稿記事 by konisi »

Single型は、単精度浮動小数点型(32ビット) という説明の基本型ですが、皆さん実際どれくらいの頻度で使っているのでしょうか?

僕はほとんどをDouble型で済ませちゃうので使う機会が少ないのですが。

Single型をよく使うと言う人は、どのような用途で使うのかを書いていただければ幸いですかね。雑談として。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#2 投稿記事 by 山本 »

型の話題で盛り上がってますな!

String型に関しては、クラスモジュール化をして、仕様をオープンにできるようにする予定なので、こちらに関しては少々お待ちください。

Single型ですが、私の場合はほとんど使わないですね。使うとしたら、DirectXなどの外部モジュールのデータで指定があるときくらいでしょうか。

実際問題、処理速度に関してはFPUに投げているので、SingleもDoubleもあまり変わりません。内部的に倍精度で計算しなければならないところなどもありますので、もしかしたら、Double型のほうがちょっと早いって可能性もあるのかも(ここらへん、どなたかベンチマーク頼みますm(__)m)!?
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#3 投稿記事 by tak »

僕はほとんどの処理を Single 型で済ませています。何故かというと、昔からの慣習で、というか癖です。
現在のメモリは dual channel 技術で多ワード転送が可能ですが、ちょっと昔は 64-bit の転送のコストは結構高かったこともありました。
精度を多少無駄にしても転送速度を上げたいこともあったのです(浮動小数点計算のまわりでは特に)。
キャッシュが乏しかった頃は転送にかかるコストも馬鹿になりませんでしたからね。
今ではそういうことも無いとわかっていつつも、つい、ね。悪しき慣習ってやつですな。

でも必ずしも悪というわけでは無いんです。(一応自己弁護)
Intel は 「必要でないならば倍精度型 (Double) ではなく単精度型 (Single) を積極的に利用すべし」という旨のことをどこかで言っていた記憶があります。(どこだったかな…)
他ならぬ Intel が提示する指針ですので、これに従う価値はあるとおもいます。(説得力

>> 山本さん
> 内部的に倍精度で計算しなければならないところなどもありますので、もしかしたら、Double型のほうがちょっと早いって可能性もあるのかも
まじっすか!?それは初耳です。僕はてっきり、内部では全部拡張倍精度 (80-bit) で処理されているものだと思い込んでいました。
この辺、ちょっくら調査しておいた方がよさそうかも。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

私がCを学んだときには既にdouble型で十分と言われてきたので,私はABでもDoubleばかり使っています。
他力本願ですが,SingleかDoubleかで迷うよりもコンパイラの最適化が進むことによる高速化の方を期待すればいいやと言う考えです。

想像で話をしても仕方が無いので検索して
http://www.google.co.jp/search?q=C+double+float
最初の方に見つかったこのページに計測するコードがあったのでABに持ってきてみました。
最後に編集したユーザー イグトランス [ 2006年5月08日(月) 07:27 ], 累計 1 回
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#5 投稿記事 by tak »

イグトランスさん、コピペ後の修正箇所が間違っていますよ。

DoubleLoop() ではカウンタが Double 型になって、演算オペランド r は Single 型のままです。そりゃあ Single が勝ちますよ。
というか Sin() の勝負では Double 型が勝っちゃってますから、本来は Double 型の方が圧倒的に速い証拠ですね。

もう一つ。Sin() は引数が暗黙的に Double 型なので、公正を期する意味で次のように変えた方が良いと思います。

コード: 全て選択

r += Sin(r)
もしくは

コード: 全て選択

r += Sin(0.1 As Single)    ' 適切な型にキャスト
# ごめんなさい、いま Linux から投稿しているのでこのサンプルをすぐには試せません。


それから、先程の「どこだったかな…」探していたら見つけました。
ftp://download.intel.co.jp/jp/developer ... inal_i.pdf
↑ これの浮動小数点に関するページ (2-54) です。
コンパイラの最適化を大前提としている点が、ちとイタイ。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#6 投稿記事 by イグトランス »

ギャー!すみません。
大ポカをやらかしてしまいましたね。
どおりでSingleが勝つわけです。

私も自宅にいるわけではなく今は試すことができません。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#7 投稿記事 by マティ »

自分もtakさんと同様に、精度を気にする必要の無い場合は、Single型で処理を行っています。
昔からの習性で、メモリー使用量が気になるからです。

他の人にプログラムを公開する必要が無い場合は、整数(固定小数点)で処理します。

例えば、
  小数点2位までの精度で十分な場合は、0.01 を 1として計算
  この時 1 は 100 と表現します。

  昔のCPUは、この方法で数百倍高速化出来たけど・・・
  今は引き継ぎしやすい表現を心がけています。

Double型の性能について
十分にチューニングを行った(SSEや並列処理を行う)ソフトウェアでは、
Single型が早いと思います。

現状のActiveBasicに限れば、データを設定する時の変換処理で
Single型の方が若干不利になっている為、Doubleを使用した方が
性能が出ていると思われます。


takさんが質問していた件について

全部拡張倍精度 (80-bit) で処理
32ビット版では、FPUで処理を行うので、各々の計算自体は80bit精度
しかし、計算結果はSingle(32bit)またはDouble(64bit)に丸めて保存。
(64bit版は不明)

「必要でないならば倍精度型 (Double) ではなく単精度型 (Single) を積極的に利用すべし」
たぶんSSEの事だと思います。
Doubleは1命令で2演算、Singleだと1命令で4演算可能になります。
精度を必要としない場合は、Singleで計算すると最大2倍早くなる可能性があるので、推奨していると思われます。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#8 投稿記事 by イグトランス »

コードを直して計りなおしました。
r = 1087937
r = 999999.999838975
Single: 332
Double: 475
Long : 119
r += 0.1を10,000,000回行った結果です。
おまけにLong版を付けてみました。 r = 3.1417601108551
r = 3.14176007475135
Single: 408
Double: 348
こちらは次の2行を2,000,000回行った結果です。
r += 0.1
r += Sin(r)
返信する