タグ

浮動小数点数に関するrryuのブックマーク (4)

  • 浮動小数点数の二段階丸め誤差 - hydrakecat’s blog

    さいきん『浮動小数点数小話』という同人誌を読んでFMA (Fused Multiply-Add)の二段階丸め誤差(double rounding error)について色々と知る機会があったのでまとめておく。ついでにFMAに関するOpenJDKのバグっぽい挙動を見つけたのでそれも併せて記しておく。 FMA (Fused Multiply-Add)とは FMAは以下のような演算のことを呼ぶ。 この演算自体は行列の乗算やベクトルの内積の計算でよく現れるものであるが、通常の浮動小数点数の乗算と加算を別々に行うと誤差が出るので一度の演算で正確な値を算出したいときに用いる。たとえばC言語(C99)では fma、fmaf、fmalという3つの関数が導入されているらしい。 FMAの実装における二段階丸め誤差 FMAはターゲットとなるCPUのアーキテクチャがFMA命令をサポートしていればその命令を直接呼び出

    浮動小数点数の二段階丸め誤差 - hydrakecat’s blog
    rryu
    rryu 2020/10/22
    異なる精度で複数回丸めを行うと丸め誤差が大きくなる話。
  • .NET Core上で実数演算すると結果がズレる - Qiita

    TL;DR .NET Core(2.2)上で倍精度浮動小数点を使った演算を行うと、同じ順序で計算させても環境によって計算結果がズレるから、比較するときとか注意すべきではないかと考える1。 実際やったこと 実行したテストの内容は以下の通り [-90°,+90°]の区間を1°につき128分割してその弧度を計算した。 予め計算されている上記に対応した弧度を元にして、sin,cos,tan及び、sin/cosを標準のSystem.Mathを使い計算した。 弧度の計算方法 弧度の計算は、以下の二種類を利用した。以下、対応するDegreesをdとする。 単純にd*(Math.Pi/180)を計算させた。 jglmを参考に倍精度浮動小数点の上位32bitを分割した上で、仮数域を拡張して、高精度計算を行った2。 実行環境一覧 今回も多数のご協力を得る事が出来た。 また、この検証を進めるに当たり、多くの方か

    .NET Core上で実数演算すると結果がズレる - Qiita
    rryu
    rryu 2019/07/19
    .NET Coreというよりは、x*y+zみたいな複合的な演算を行う命令が使われると丸めの回数が変わるので誤差の出方が変わるということのようだ。
  • x + 0.25 - 0.25 = xが成り立たないxとは何か|Rui Ueyama

    スタンフォードのコンピュータサイエンスの授業で、ときどきこれは良問と思う問題がテストで出ることがある。僕の印象に残っているのは「xをfloatとするとき、x + 0.25 - 0.25 = xが成り立たないxを求めよ」というものだ。浮動小数点数を理解していないと、両辺が同じにならないケースがあるほうが不自然に思えるだろうから、この問題は浮動小数点数の奇妙さを結構うまく突いていると思う。この問題を元に浮動小数点数についてちょっと説明してみよう。 まずコンピュータ上での数について少し考えてみよう。コンピュータにおける数と、数学の整数や実数は、よく考えてみると全然違う。コンピュータは有限の記憶領域しか持っていないので、無数にある数を表すことが根的にできない。つまりコンピュータ上の数は「物の数になるべく似せた別の何か」だ。現実的には、例えば32ビットの数なら2^32パターンしか表せないので、そ

    x + 0.25 - 0.25 = xが成り立たないxとは何か|Rui Ueyama
    rryu
    rryu 2017/11/29
    情報落ちを起こせばいいのか。
  • PHPのround関数とは一体なんだったのか - hnwの日記

    (7/3 14:05追記)Javaに関する記述について誤認があったので盛大に書き換えました。Java 6、Java 7、Java 8それぞれで実装が変わっていたようです。 (7/13 23:55追記)記事中ではroundを四捨五入と言い切ってしまっています。これは筆者がC99のroundを基準に考えているためですが、言語によっては偶数丸めになっているround関数も珍しくありません。ご注意ください。 PHPのround関数について、ネット上で次のような記述を見つけました。 PHP 四捨五入の計算を間違える唯一の言語として畏れられていましたが、そのバグは治っているかもしれません(治ってないかもしれません) 主要なプログラミング言語8種をぐったり解説 - 鍋あり谷あり 各言語を面白おかしく紹介する内容とはいえ、ずいぶん雑な理解だなーという印象です。ゆるふわな話だけでPHPがdisられ続けるの

    PHPのround関数とは一体なんだったのか - hnwの日記
    rryu
    rryu 2016/07/03
    真値から近似値への丸めが最近値丸めだと真値よりも大きな値になることがあるという罠に人類は弱い……
  • 1