簡體   English   中英

是否有可能找到不適合 %.6g 的浮點數

[英]is it possible to find float that not fit to %.6g

假設我們始終使用相同的 C 語言環境。

是否有可能在下面的代碼中找到這樣的浮點value restore_x restored_x != value

float x = value;
char s[32];
sprintf(s, "%.6g", x);//do not use snprintf for simplicity
float restored_x = 0.;
sscanf(s, "%g", &restored_x);

換句話說,我發現使用%.6g進行序列化的代碼,並且我知道二進制浮點數的十進制表示在“點”之后不完全是 6 位,它可能是 7 位或更多位。 但是我找不到這樣的數字(值?=restored_x)它存在嗎?

我不考慮 NaN 和 +-Inf 等特殊情況,因為有斷言可以驗證 function 中的輸入,它使用%.6g進行序列化。

對於x = 0.0001220703052240423858165740966796875frestored_x不等於x 即使%.6g更改為.8grestored_x也不會等於x 它將是 0.0001220703125。

(這假設 C 實現使用 IEEE-754 binary32 進行float和正確舍入,並使用四舍五入到最近的關系,C 標准都不需要。)

64,452,836 個浮點值(大約是有限值的 1.5%)需要 9 位數字才能在往返二進制 - 十進制 - 二進制轉換中存活。

6 ( FLT_DIG ) 是十進制數字的最大數量,可以從十進制到float ,然后返回到十進制而不會丟失。 僅區分接近但不相等的float值是不夠的; 存在不相等的float值,它們將與%.6g打印相同。 在最壞的情況下,您需要FLT_DECIMAL_DIG (9) 位來安全地通過十進制字符串往返float ,並且需要更多以精確地以十進制表示值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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