簡體   English   中英

C是否舍入浮點常數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM