浮動小数点数の比較と定数畳み込み

浮動小数点数を比較する際は気をつけようね!
11
野生の男 @yasei_no_otoko

減算を別関数に分けたら無事?falseになったのでD言語のcompile time foldingが超強力っぽい pic.twitter.com/5YpkDXverg

2017-10-27 14:36:35
拡大
拡大
mod_poppo @mod_poppo

これによるとD言語の浮動小数点数の定数畳み込みはreal型で行われるとあるので、x86の80ビット浮動小数点数が使える環境なら通常の倍精度と結果が変わっても不思議ではない dlang.org/spec/float.htm…

2017-10-27 15:02:11
mod_poppo @mod_poppo

(実際 80 ビットだとどうなるのか知らないけど)

2017-10-27 15:02:30
tom tan @tm_tn

D言語だと、浮動小数点数の比較は std.math.approxEqual 使う方がいいですね。 #dlang

2017-10-27 10:23:00
mutaguchi @mutaguchi

goとかDは10進型として扱ってるのかなぁ?

2017-10-28 11:27:34
花月かすみΛ__Λ @k_hanazuki

@mutaguchi D言語に関して言うと,浮動小数点数の定数畳み込みは最低でもreal型の精度(amd64だと80bit)で計算することになっていて,そのあとリテラルのdouble精度(同64bit)まで落とすので,0.3-0.2と0.2-0.1は同じ値になってしまいます.

2017-10-28 16:20:31
mutaguchi @mutaguchi

@k_hanazuki 定数畳み込みと実行時では演算精度が違うのが、結果が異なる原因なんですねー。

2017-10-28 19:41:15
花月かすみΛ__Λ @k_hanazuki

D言語で0.3-0.2と0.2-0.1が等しくなるやつ、浮動小数点数の定数畳み込みはreal型(amd64だと80bit)で計算されることになっていて、その結果をdouble(64bit)の変数に代入しているから。

2017-10-28 19:14:49
旧ぱくとま @pakutoma_old

NowBrowsing: マシンの中のリアル : Dの浮動小数点数 - プログラミング言語 D (日本語訳): kmonos.net/alang/d/d-floa… 面白いなあ

2017-10-28 21:48:10

その他の反応

RAO(らお) @RIORAO

もちろんJSに限らずほとんどの言語が同じ結果を返します(^◇^)

2017-10-28 02:01:44
クノーツアクア @Qunoxts

@RIORAO あれ……? JS君ってこんなに可愛かったっけ……。 そうだったわ、機械は二進数しか理解できないんだった。 循環小数の恐怖ですね。僕もDouble型使うときは気を付けよっと。 JS「え?僕の事じゃないの?」 僕「黒魔術用の言語(C++)使ってるから……」

2017-10-27 02:23:21
黒狐 @inaba_darkfox

@RIORAO pythonのインタラクティブシェルでもFalseになったから同じ計算方式なのかな・・ pic.twitter.com/PkW21m5oG5

2017-10-27 02:25:01
拡大
ハインド @PMDSky_Aintei

@RIORAO decimalの使いどころが分かった気がしました。ありがとうございました。 pic.twitter.com/DAwzlPsRYT

2017-10-27 07:05:36
拡大
山田徹 @yamada_toru1980

@RIORAO for(var i =0;i < 10;i += 0.1) とやるとiがどんどんおかしな数字になるのと同じかな? if (i==0.9)に当たらなくて帰れなかった記憶が…

2017-10-27 07:44:24
せがゆう @sega_yuu

@RIORAO MDNにもしっかり明記される程度には一般的な仕様なんですよね developer.mozilla.org/ja/docs/Web/Ja…

2017-10-27 09:09:55
Dashiko(ダシコちゃん)🎈 (誕生日01/06) @Dashmon13

@RIORAO and I just Test another thing var a=0.30000000000000000000000045454454 var b=0.29999999999999999999999999999999 var c=a==b c is true

2017-10-27 11:28:25
すすこべ @sskobe

@RIORAO 2進数に変換してるのは気付かず、納得(・ o・๑)しました...

2017-10-27 20:28:12
折ちゃん @kakuninhuka

これって結局 基本的に浮動小数で0.1とか0.2をきれいに表示できないからだと思う twitter.com/KASServerTF2/s…

2017-10-27 12:02:40
齊藤 @saito_ta

Perl6 も True を返しますね(有理数として扱われるので誤差が出ない) twitter.com/KASServerTF2/s…

2017-10-27 22:09:12
でこれき @dico_leque

最適化(?)で意味変わってるじゃないすかやだーっぽさがある > RT

2017-10-27 23:34:52
でこれき @dico_leque

Racketだと (= (- #e0.3 #e0.2) (- #e0.2 #e0.1)) なら #t になる(exact な 0.3 であるところの #e0.3 が rational の 3/10 になったりする

2017-10-27 23:38:03
NaOHaq(苛性ソーダ) @NaOHaq

ぶっちゃけこれJavaScriptに限った問題じゃないっていうか、精度保証つき数値計算ライブラリをJavaScriptに移植すればいいのでは twitter.com/RIORAO/status/…

2017-10-27 11:26:10
RAO(らお) @RIORAO

正確な実数計算をやらされるJavaScriptくん #擬竜戯画 pic.twitter.com/ipE56C2YbV

2017-10-27 02:16:02
NaOHaq(苛性ソーダ) @NaOHaq

やはり精度保証つき数値計算ライブラリをJavaScriptで実装するしかないのでは(誰がやるんだ) (1/10+1/10+1/10 == 3/10 がtrueになって欲しい、くらいなら有理数型があればいいような気もするけど)

2017-10-27 15:07:40