[英]Does C round floating-point constants
關於Go中浮點精度的問題使我想知道C如何處理問題。
使用C中的以下代碼:
float a = 0.1;
將a
具有最接近的IEEE 754二進制表示:
00111101110011001100110011001101 (Decimal: 0.10000000149011612)
或者只是將它裁剪成:
00111101110011001100110011001100 (Decimal: 0.09999999403953552)
或者根據編譯器/平台的不同而不同?
允許實現(或者甚至多一個):
對於十進制浮點常量,以及當FLT_RADIX不是2的冪時的十六進制浮點常量,結果是最接近的可表示值,或緊鄰最接近的可表示值的較大或較小的可表示值,在實現定義中選擇方式。
(C11,§6.4.4.2/ 3)
從C99開始,我們已經有了十六進制浮點常量,因此您可以精確指定所需的位(假設實現提供二進制浮點:)),所以您可以說,例如:
float a = 0x1.99999Ap-4;
對於IEEE 754 32位浮點數:
#include <stdio.h>
int main() {
float a = 0.1;
float low = 0x0.1999999p0;
float best = 0x0.199999ap0;
float high = 0x0.199999bp0;
printf("a is %.6a or %.16f, which is either %.16f, %.16f or %.16f\n",
a, a, low, best, high);
return 0;
}
未指定標准,但在某些本地硬件上進行測試:
#include <stdio.h>
int
main( int argc, char **argv )
{
float a = 0.1;
double b = a;
printf("%.16f\n", b );
}
0.1000000014901161
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.