タグ

ブックマーク / ameblo.jp/fadis (2)

  • 『x86でfloatの精度で桁落ちさせるには』

    前回、起こるはずの桁落ちが起こらない不思議現象の原因を特定した。 ではx86では単精度浮動小数点数の精度で桁落ちを起こすことはできないのだろうか。実は案外簡単にできる。SSEを使えばいいのだ。試しに前回のソースをSSEを使うようにしてコンパイルしてみよう。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { float hoge = 1.0e-9; float piyo = 3.0; printf( "%e\n", piyo - sqrt( piyo * piyo - hoge ) ); }

    y_r
    y_r 2009/09/25
    SSEならきっちり 32 bit 幅で計算してくれますわよ。
  • 『FPU』

    #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { float a = 1.0e-9f; float b = 3.0f; float c = 1.0f; float result[ 2 ]; result[ 0 ] = ( b + sqrt( b * b - 4 * a * c ) ) / 2; result[ 1 ] = ( b - sqrt( b * b - 4 * a * c ) ) / 2; printf( "%e, %e", result[ 0 ], result[ 1 ] ); exit( EXIT_SUCCESS ); } IEEE754の単精度浮動小数点数の係数部は24bitで、10進数にしてせいぜい7-8桁しか表現できない。そのため、sqrtが呼び出される前に4acが消えてしまい、bの

    y_r
    y_r 2009/09/25
    float で計算しているはずなのに double 以上の精度で計算されている怪。それもこれも浮動小数レジスタが 80 bit幅なのが原因。
  • 1