doubleを出力するとき、または文字列をdoubleに変換するときの精度について、Cのルールを理解できない。次のプログラムは、私のポイントを説明する必要があります。Cの文字列をdoubleに変換するときの奇妙な動作
#include <errno.h>
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
double x, y;
const char *s = "1e-310";
/* Should print zero */
x = DBL_MIN/100.;
printf("DBL_MIN = %e, x = %e\n", DBL_MIN, x);
/* Trying to read in floating point number smaller than DBL_MIN gives an error */
y = strtod(s, NULL);
if(errno != 0)
printf(" Error converting '%s': %s\n", s, strerror(errno));
printf("y = %e\n", y);
return 0;
}
を私はコンパイル時に取得し、(GCC 4.5.2とCore 2 Duoプロセッサ上で)このプログラムを実行する出力は、次のとおりです。
DBL_MIN = 2.225074e-308, x = 2.225074e-310
Error converting '1e-310': Numerical result out of range
y = 1.000000e-310
私の質問があります:
- なぜxは非ゼロの数字として印刷されますか?私は、コンパイラが計算の目的で倍精度をより高精度の型に昇格させることがあることを知っていますが、xを64ビットのdoubleとして扱うべきではありませんか?
- Cライブラリが密接に拡張精度浮動小数点数を使用している場合、これらの小数を変換するときにstrtodがerrnoを設定するのはなぜですか?とにかく正しい結果が得られるのはなぜですか?
- この動作は、特定のハードウェアおよび開発環境の結果であるバグですか? (残念ながら、現時点で他のプラットフォームではテストできません)
ありがとうございました。私はフィードバックを得る際に問題を明確にしようとします。そのためIEEE-754規格のdenormal numbersの存在の
:: 'DBL_MIN = 2.225074e-308'はあまり意味がありませんフロートの解析 ""
http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Math-Error-Reporting.html
は(このページは明示的にはglibcstrtod
ページにリンクされていることに注意してください"最小IEEE DP値が '4.94066e-324'であるので、' 100'での割り切りが正しく動作する理由を説明しますが、なぜ 'DBL_MIN'が' 4.94066e-324'でないのかがわかります。 – Mysticial以下に明示されています:DBL_MINは最小の_normalised_値 –