首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能找到不适合%.6g的浮点

是否有可能找到不适合%.6g的浮点
EN

Stack Overflow用户
提问于 2019-09-20 18:15:24
回答 2查看 74关注 0票数 0

假设我们总是有相同的C语言环境。

是否有可能在代码下面的value中找到这样的浮动restored_x != value

代码语言:javascript
复制
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等特殊情况,因为有一些断言可以验证函数中使用%.6g进行序列化的输入。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-20 18:44:43

对于x = 0.0001220703052240423858165740966796875frestored_x并不等于x。即使将%.6g更改为.8grestored_x也不会等于x;它将是0.0001220703125。

(这假设C实现使用IEEE-754 binary32进行float,并使用圆整到最近的关系对偶数进行舍入,C标准不需要这些。)

64,452,836个浮点值(约为有限值的1.5% )需要九位数才能经受双程二进制-十进制-二进制转换。

票数 3
EN

Stack Overflow用户

发布于 2019-09-20 18:32:25

6 (FLT_DIG)是小数位数的最大值,可以从十进制到float,再返回到十进制,而不会丢失。不足以区分接近但不相等的float值;存在与%.6g相同的不相等的float值。在最坏的情况下,您需要FLT_DECIMAL_DIG (9)位数来安全地往返于小数字符串中,并且需要更多的数字来精确地以十进制表示值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58033367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档