C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Singleとdoubleの使い分け

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■84510 / inTopicNo.1)  Singleとdoubleの使い分け
  
□投稿者/ ジャマイカ (1回)-(2017/07/10(Mon) 16:40:43)

分類:[.NET 全般] 

Singleとdoubleの使い分け方について教えてください。

Singleは4byte、doubleは8byteで
有効数字が7桁と16桁です。

そのため、けた落ちしないように計算するためには
doubleを使うべきだと思います。

一方で計算時間を比較すると
singleで宣言した場合であっても
PC内部では一度doubleに変換してから計算が行われると聞きました。

それだと、singleを使うメリットは何なのでしょうか?

巨大な数値配列を宣言したい時に、
メモリが足りなくなるのを防ぐ用途くらいしか思い当たらないのですが
それだけのために存在するのでしょうか?



引用返信 編集キー/
■84512 / inTopicNo.2)  Re[1]: Singleとdoubleの使い分け
□投稿者/ 774RR (539回)-(2017/07/10(Mon) 17:25:06)
おおよそその通りっす。フツーにパソコンの CPU を使う範囲では

・演算速度は double のほうが(型変換しない分だけ) single より速い
・メモリ消費量は single だと半分で済む

その昔はパソコン本体メモリが 640KByte とかだったのでサイズの差は大事だったんですが、
今時のパソコンではほぼ single を使う理由はない感じです。

例外的なことを言えば
・ CUDA の演算コアは float (single) なので CUDA を使う場合には single のほうが速い
・組み込み用マイコンの 32bit 機種では float (32bit) 演算しかないものがある
・超高速演算が必要な時、キャッシュラインの整列のためには single でないと入らない
などの限られた状況で single の出番は今でもあります。

引用返信 編集キー/
■84514 / inTopicNo.3)  Re[2]: Singleとdoubleの使い分け
□投稿者/ ぶなっぷ (115回)-(2017/07/11(Tue) 15:20:10)
ちなみに、桁落ちは2進数と10進数の変換誤差でも発生するので、
doubleにしても防ぎきることはできません。

人間の目から見た(= 10進数)桁落ちを防ぐなら、
Decimal型が必須になります。

引用返信 編集キー/
■84537 / inTopicNo.4)  Re[3]: Singleとdoubleの使い分け
□投稿者/ ジャマイカ (2回)-(2017/07/13(Thu) 19:26:33)
774RRさん

ありがとうございます。

ちなみに、
・超高速演算が必要な時、キャッシュラインの整列のためには single でないと入らない


というのはどういった操作のことを指していますか?
 
引用返信 編集キー/
■84539 / inTopicNo.5)  Re[4]: Singleとdoubleの使い分け
□投稿者/ 774RR (540回)-(2017/07/14(Fri) 06:06:48)
最近の x86/x64 CPU とかだと CPU 内蔵キャッシュがあるわけですが
今時の最高速 CPU の内部処理速度は、メインメモリより50倍以上高速だったりするので、
L1 cache にヒットし続けるように処理を書くとびっくりするほど速度が向上します。

x86/x64 CPU においては L1 cache が L2 cache からデータを引き込む・書き戻す単位は 64byte だったりします。
https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%A1%E3%83%A2%E3%83%AA
この単位のことをキャッシュラインサイズといいます。

これがどういうことかというと、
・64の倍数アドレスから64バイト単位でデータを読む
・64の倍数アドレスから64バイト単位でデータを書き戻す
ということです。ソフトウエアを書く側の立場で見ると、
ソフトウエア的には1バイトをアクセスしたい場合であっても、そのアクセスが L1 cache にヒットしない場合、
ハードウェア的には64バイトをロードしてしまうってことです。

ということは 64の倍数アドレスに64バイト以下のサイズのデータを置いて、それ1個にだけアクセスすると
うまく L1 cache にヒットし続けて速度が向上します。
構造体というかクラスというか、のサイズが double を使うと 64 バイトを超過し single だと超過しない、
ような場合には、精度を犠牲にして速度を向上させることが可能です。

引用返信 編集キー/
■84544 / inTopicNo.6)  Re[5]: Singleとdoubleの使い分け
□投稿者/ ジャマイカ (3回)-(2017/07/14(Fri) 10:41:58)
ありがとうございます。
CPUのキャッシュを使うと速くなるというのは理解できています。

具体的にVB.NETを使って
どのようなコードを書けばこれの恩恵を受けることができるか
お教えいただけないでしょうか?
 
引用返信 編集キー/
■84547 / inTopicNo.7)  Re[6]: Singleとdoubleの使い分け
□投稿者/ 774RR (541回)-(2017/07/14(Fri) 11:24:51)
.NET の世界はそういう特定 CPU の特定機能をバリバリに使うような目的には向かないので難しいっすね。
.NET 向けに書いたコードは CPU を選ばずに動くのが売りだったりするので。
(ARM 向け .NET とか)

そういうのやりたかったら native の世界へようこそ!

引用返信 編集キー/
■84566 / inTopicNo.8)  Re[7]: Singleとdoubleの使い分け
□投稿者/ ジャマイカ (4回)-(2017/07/16(Sun) 12:56:06)

>
> そういうのやりたかったら native の世界へようこそ!
>

そうでしたか
ありがとうございます。
 
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ