私は32ビットから64ビットにいくつかのコードを移植しており、答えが同じであることを保証しています。その際、私はatan2fが2人の間で異なった結果を出していることに気付きました。atan2fはm32フラグで異なる結果を返します
gcc compilerTest.c -o 64bit.out -lm
:で構築された場合
atan2f: 1.914544820785522
atan2: 1.914544820785522
:
gcc compilerTest.c -m32 -o 32bit.out -lm
ことができます:で構築された場合
#include <stdio.h>
#include <math.h>
void testAtan2fIssue(float A, float B)
{
float atan2fResult = atan2f(A, B);
printf("atan2f: %.15f\n", atan2fResult);
float atan2Result = atan2(A, B);
printf("atan2: %.15f\n", atan2Result);
}
int main()
{
float A = 16.323556900024414;
float B = -5.843180656433105;
testAtan2fIssue(A, B);
}
:
私はこの分REPROを作成しましたそれは与える:
atan2f: 1.914544701576233
atan2: 1.914544820785522
注意にatan2は、どちらの場合も同じ結果が得られますが、atan2fないこと。私が試みた
もの: -msse2 -mfpmath = SSE
32ビットバージョンをビルド-ffloat店舗
32ビットバージョンをビルド
-mfpmath = 387での64ビットバージョンの構築
私の結果は変更されていません。
(。これらのすべては、それが浮動小数点演算は、64ビット・アーキテクチャ対32ビットで発生方法とは何かを持っているという仮説に基づいていた)
質問:
私は何です同じ結果を得るためのオプション? (使用できるコンパイラフラグはありますか?)また、ここで何が起こっていますか?
私はi7マシンで実行していますが、それが役に立ちます。
atan2f:%.15f \ n "' _は十分に正確ではないかもしれません。 '"%.16e \ n "'またはそれ以上の "%a \ n" 'を使って調査してください。 – chux
なぜ2つの異なるライブラリが全く同じ結果を提供し、どのプラットフォームのサイズが両方のプラットフォームで 'float'になるのでしょうか?違いは心配するものではありません。 – Olaf
「1.914544701576233」と「1.914544820785522」は、[ULP](https://en.wikipedia.org/wiki/Unit_in_the_last_place)の2ビットで異なることに注意してください。 – chux