アカウント名:
パスワード:
.NET Frameworkにはそもそも単精度実数向けのSqrt()関数がないっぽいので、そのためかもしれない。電卓も倍精度で計算するように直せばいいのでは。
PS> ([math]::sqrt(4)-2).tostring("e20")0.00000000000000000000e+000PS> ([math]::sqrt(0.04)-0.2).tostring("e20")0.00000000000000000000e+000
0.1は想定通り誤差が出る。
PS> (0.1).tostring("e20")1.00000000000000010000e-001
電卓の主な利用はお金の計算で、10進数での正確な端数処理が求められます。普通は2進小数は使いません。
普通はお金の計算で平方根がでてくるの?
平方根くらいならともかく10進小数で超越関数のアルゴリズム組むくらいなら2進小数に一度変換するのが「普通」の考え方だと思う
いえ、少なくとも電卓や計算科学では「普通」じゃないです。
四則演算や平方根じゃなく超越関数ですよ?三角関数や対数・指数関数を10進小数のまま計算する普通の例を見せてください
電卓の場合はCORDICアルゴリズムを使うことが多いです。これはテーブルと四則演算だけで三角関数や対数・指数関数を求められるアルゴリズムですね。CORDICはbinaryだとビットシフトで除算を代用できるのですが、電卓では速度より精度を重視してBCDで計算するのが一般的です。https://en.wikipedia.org/wiki/CORDIC [wikipedia.org]
他の例で、ソフトウェアなんかだと例えばbcは10進で演算してますね。あとはMaximaも10進で演算しているはずです。
高速化の為にbinary化して演算しているマシンやアルゴリズムはあると思いますが、精度が求められる関数電卓や数値計算でbinray化するのが当然、普通とまでは言えないと思います。
一点だけ>bcは10進で演算してますね。dcとして起動したときでは?bcとして起動すると基本二進
私も一点だけ
ユーザが意識することはないですがMaximaのBigfloatも内部では2進で表現されていますよ
?print(1b0);とかすると分かります
GNU版bcをイメージしていました。GNU版bcは10進とマニュアルにも書いてあります。https://www.gnu.org/software/bc/manual/html_mono/bc.html#SEC5 [gnu.org]
不勉強ですいませんが、decimalかbinaryかは実装によって違うのでしょうか?もしそうだとしたら例としては良くなかったですね。。。
だがしかしエクセルで会計事務を…
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
普通のやつらの下を行け -- バッドノウハウ専門家
.NET Frameworkだと誤差は出ない (スコア:1)
.NET Frameworkにはそもそも単精度実数向けのSqrt()関数がないっぽいので、そのためかもしれない。
電卓も倍精度で計算するように直せばいいのでは。
PS> ([math]::sqrt(4)-2).tostring("e20")
0.00000000000000000000e+000
PS> ([math]::sqrt(0.04)-0.2).tostring("e20")
0.00000000000000000000e+000
0.1は想定通り誤差が出る。
PS> (0.1).tostring("e20")
1.00000000000000010000e-001
Re: (スコア:0)
電卓の主な利用はお金の計算で、10進数での正確な端数処理が求められます。普通は2進小数は使いません。
Re:.NET Frameworkだと誤差は出ない (スコア:1)
普通はお金の計算で平方根がでてくるの?
平方根くらいならともかく
10進小数で超越関数のアルゴリズム組むくらいなら
2進小数に一度変換するのが「普通」の考え方だと思う
Re: (スコア:0)
いえ、少なくとも電卓や計算科学では「普通」じゃないです。
Re: (スコア:0)
四則演算や平方根じゃなく超越関数ですよ?
三角関数や対数・指数関数を10進小数のまま計算する普通の例を見せてください
Re: (スコア:0)
電卓の場合はCORDICアルゴリズムを使うことが多いです。
これはテーブルと四則演算だけで三角関数や対数・指数関数を求められるアルゴリズムですね。
CORDICはbinaryだとビットシフトで除算を代用できるのですが、
電卓では速度より精度を重視してBCDで計算するのが一般的です。
https://en.wikipedia.org/wiki/CORDIC [wikipedia.org]
他の例で、ソフトウェアなんかだと例えばbcは10進で演算してますね。
あとはMaximaも10進で演算しているはずです。
高速化の為にbinary化して演算しているマシンやアルゴリズムはあると思いますが、
精度が求められる関数電卓や数値計算でbinray化するのが当然、普通とまでは言えないと思います。
Re: (スコア:0)
一点だけ
>bcは10進で演算してますね。
dcとして起動したときでは?
bcとして起動すると基本二進
Re: (スコア:0)
私も一点だけ
ユーザが意識することはないですがMaximaのBigfloatも内部では2進で表現されていますよ
?print(1b0);
とかすると分かります
Re: (スコア:0)
GNU版bcをイメージしていました。
GNU版bcは10進とマニュアルにも書いてあります。
https://www.gnu.org/software/bc/manual/html_mono/bc.html#SEC5 [gnu.org]
不勉強ですいませんが、decimalかbinaryかは実装によって違うのでしょうか?
もしそうだとしたら例としては良くなかったですね。。。
Re: (スコア:0)
だがしかしエクセルで会計事務を…