加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 打印最大的单精度浮点数

发布时间:2020-12-16 09:55:26 所属栏目:百科 来源:网络整理
导读:我来寻求知识. 我想了解浮点数. 我试图弄清楚为什么,当我打印最大的浮点数时,它无法正确打印. 2-(2^-23) Exponent Bits1.99999988079071044921875 * (1.7014118346046923173168730371588e+38) = 3.4028234663852885981170418348451e+38 这应该是最大的单精度
我来寻求知识.
我想了解浮点数.
我试图弄清楚为什么,当我打印最大的浮点数时,它无法正确打印.

2-(2^-23)                          Exponent Bits
1.99999988079071044921875 * (1.7014118346046923173168730371588e+38) = 
    3.4028234663852885981170418348451e+38

这应该是最大的单精度浮点数:

340282346638528859811704183484510000000.0

所以,

float i = 340282346638528859811704183484510000000.0;
printf(TEXT,"Float %.38f",i);
Output: 340282346638528860000000000000000000000.0

很明显这个数字正在四舍五入,所以我试图找出究竟发生了什么.

我的问题是:
维基百科文档指出3.4028234663852885981170418348451e 38是可以在IEEE-754定点中表示的最大数字.

存储在浮点寄存器中的数字是否为0 22222111 22222222222222222222111并且显示不正确?

如果我写printf(TEXT,“Float%.38f”,FLT_MAX);,我得到相同的答案.
也许我使用的计算机不使用IEEE-754?

我理解错误与计算,但我不明白为什么数字
340282346638528860000000000000000000000.0是可以准确表示的最大浮点数.

也许Mantissa * Exponent导致计算错误?如果这是真的,那么340282346638528860000000000000000000000.0将是可以忠实地表示而没有计算错误的最大数字.我想那是有道理的.只需要一个祝福.

谢谢,

解决方法

看起来罪魁祸首是printf()(我猜因为float在传递给它时会隐式转换为double):

#include <iostream>
#include <limits>

int main()
{
    std::cout.precision( 38 );
    std::cout << std::numeric_limits<float>::max() << std::endl;
}

输出是:

3.4028234663852885981170418348451692544e+38

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读