ちょっと前にblueskyで見かけた話題。もとは「GraphQLのスキーマではintが32ビットしかなくて、64ビット整数とかないのがイケてない」といった話だったかなと思う。直感的にはこれは「Javascriptではすべてが倍精度浮動小数点数だから64bit intがないから」ということになるが、よくよく調べてみるといろいろややこしい歴史的事情があるようだ。 たしかにJSにはもともとひとつのNumber型しかなく、いわゆるdouble型(倍精度浮動小数点)だけで数値を表現してきた。IEEE754の倍精度浮動小数点数は仮数部が52ビットあるので、実際には32ビット整数ていどであれば全て誤差なく表現できる。なので32ビット整数または倍精度浮動小数点数がどちらも使えるというふうに理解されてきた。 そうはいっても不便なので、現代のJSにはBigIntがある。ES2020で導入されたらしい。ただし普
Herbie detects inaccurate expressions and finds more accurate replacements. The red expression is inaccurate when x > 1; Herbie's replacement, in blue, is accurate for all x. Herbie improving accuracy on the “Hamming” benchmark suite. Longer arrows are better. Each arrow starts at the accuracy of the original expression, and ends at the accuracy of Herbie’s output, in each case on random double-pr
昔話 それは昔々のこと。 x86には浮動小数点演算を行う手段がなく、外付けの浮動小数点演算ユニットを接続するという手法で、浮動小数点演算を実現していたのであった。 x87と呼ばれたそれはとてもエクセレントなシステムで…という話はwikipediaに譲ろう。 https://ja.wikipedia.org/wiki/Intel_8087 重要なのは、x87が内部表現として80bitの拡張倍精度を使っている、ということ。 これのおかげで、x87においては、確かに~~doubleのほうが速かった (floatだとdoubleへのキャストコストが発生するため)~~ 嘘だろそれ。ASM見たら別にキャストとかしてなかったわ。 どっちかというと丸めの影響で精度が異なることのほうが重要だわ。 改めて調べてみると、doubleが速いとされている資料についてはあんまりないことに気付く。 (同等としている資料
パイについての考え方はいくつかあり、アップルパイ、パンプキンパイ、キーライムパイなどさまざまです。それと同様に、数学定数である円周率 ℼ の表現方法もさまざまで、3.14159 と表したり、0 と 1 が延々と続く 2 進数で表したりもできます。 無理数である円周率は、繰り返すことなく永遠に続く 10 進数です。そのため円周率を使って計算を行う場合、人間かコンピューターが数値を切り捨てたり四捨五入したりする前に、小数点以下の桁数を指定する必要があります。 小学校では 3.14 として手計算しますが、高校の関数電卓では桁数が10 桁になることもあります。これは、同じ数値をより高い詳細度で表しています。コンピューター サイエンスではこれを精度と呼び、通常は 10 進数ではなくビット、つまり 2 進数を単位とします。 複雑な科学的シミュレーションの場合、開発者は長年、ビッグバンのような出来事を理
有限桁 C言語で扱える実数値は,2進数の有限小数で表された数値である.例えば次のようなものである. 1.5(10) = 1.1(2) 3.25(10) = 11.01(2) 理論的には小数が無限に続く値でも,そのうちの有限個の桁数でその値を表すしかない. 例えば,0.1 を2進数の小数で表すと 0.1(10) = 0.000110011001100110011...(2) と無限に続くが,コンピュータの内部では有限桁で丸められている. このような場合には,本当の値ではなく,近似値でしか表すことができない. 指数表記(浮動小数点表記) 科学計算では非常に大きな実数値や非常に小さな実数値も扱うことがある. そのようなときには,通常の10進数の表記ではなくて,次のような指数表記で表すれば 無駄な 000...000 という桁を表記しなくてもよくなる. 1234567890000000000000
// #include <float.h> // FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON // #include <math.h> // fabsf, fabs, fabsl, fmaxf, fmax, fmaxl /* float型(倍精度浮動小数点数) */ if (fabsf(a - b) <= FLT_EPSILON * fmaxf(1.f, fmaxf(fabsf(a), fabsf(b)))) {} /* double型(単精度浮動小数点数) */ if (fabs(a - b) <= DBL_EPSILON * fmax(1, fmax(fabs(a), fabs(b)))) {} /* long double型(四倍精度浮動小数点数) */ if (fabsl(a - b) <= LDBL_EPSILON * fmaxl(1.L, fm
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く