TarZの日記: 10進演算で出たネタをまとめてみた 6
東京海上日動の新システムはCOBOLを採用のストーリーで出たネタが面白かったのでまとめてみた。
# ただ、私は言語オタクではないので、色々な言語について詳しく知っているわけではない。(ミスがあったらご指摘ください)
お題 : 手近な言語で0.1を1万回足してみなよ。(#1417986)
(#1418003) VB
@をつけるとDecimal型で解釈される。誤差なし。
(#1418010) Ruby
BigDecimalだから誤差なし。
(#1418056) VB Script
誤差あり。
(#1418017) AWK
誤差あり。続くコメントも参照。
(#1418039) C82-BASIC (CASIO FP-1100)
8ビット時代の有名な10進演算BASIC。もちろん誤差なしで1000となる。
(#1418047) Haskell
私は使ったことがないのでよく判らないのだが、このケースでは10進演算していないので誤差あり。
(#1418087) Python
Decimalなので誤差なし。
(#1418118) Java
java.math.BigDecimalでの演算なので誤差なし。コード例も書いてほしかった…。
おまけ
(#1418148) ぴゅう太 日本語G-BASIC
確か、ぴゅう太のBASICは整数のみだったはず。よって、Line 30でエラー。
-
[18:47 追記] - - - - - - - -
言語マニアな皆様、コメントありがとうございます。/.Jの片隅に、こんな有用なコメントが集まってよいのでしょうか。
ただ今、この課題(#1418561)を読み解き中。(うひょー、SIMD演算命令って読み慣れない。命令セットとにらめっこしつつ読み読み)
この例では、IA32 SIMD命令の8ビット比較(PCMPGTB)を使って桁上がりの検出~処理をしているのでゾーン10進ですが、ビット演算を駆使してパック10進にできないかなあ。
余力のある方は、こちらの課題もどうぞ。(#1256654)
Z80 & 1024バイトのメモリを駆使して、自然対数の底をBCD100桁求める
戦略はあるのですが、とても64バイトにできそうにないです…。
この辺の計算誤差の話は… (スコア:2, 参考になる)
まとめてもらって助かります。
# 論文とかでかなりあるんですよ。2進数で計算して誤差が出ているのに、
# printf()が四捨五入する際の誤差と合わせると、「誤差が多い計算法」
# の方が「たまたま精度が高くなる」のを、安定した低誤差法と間違えているケースが。
# 査読などをやっていると、こういう間違いを指摘し、正すのが大変で…
fjの教祖様
Java(JSP) (スコア:1)
JavaScriptとJScript (スコア:1)
=1000.0000000001588 WScript(JScript)
=1000.00000000016 BigDecimal support for JavaScript [stz-ida.de]とか、JScript 8.0 [microsoft.com]とか知りません><
ASPとIEのJScriptとVBSの違い (スコア:1)
=1000.00000000016 ASPでVBS
=1000.00000000016 ie6でJScript(明示)
=1000.0000000001588 ie6でVBS
=1000.00000000016 VBSはサーバー ⇔ ブラウザ間で整合性がとれているけど、
JScriptはブラウザ ⇔ ブラウザ間の整合性を重視してるから、
ie上の精度だけ実装を変えている…という事ですね?わかりません><
Perlが無いのね。 (スコア:1)
SIMDでBCD (スコア:1)
処理は複雑になりますが、同じビット数で倍の桁数処理できるので、桁数あたりの演算速度は確実に速くなると思います。