gpt4 book ai didi

c++ - 如何计算 double/float C++ 中的位数

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:51 25 4
gpt4 key购买 nike

我正在尝试计算 double 的小数部分的位数,但出了点问题,我得到了无限循环:

double pi = 3.141592;
int counter = 0;
for (; pi != int(pi); ++counter)
pi *= 10;
cout << counter << endl;

我刚读到这个问题,但是我找不到好的解决方案。真的没有比将数字转换为字符串并计算字符更好的方法了吗?我想还有更正确的方法。

最佳答案

计算机中的 float 使用二进制(以 2 为底,0 和 1,就像计算机中的几乎所有数字一样)。因此,它们中有一个确切数目的二进制数字,double 中的位数较多,float 中的位数较少。但是,如果您将像 3.141592 这样的十进制常量转换为 double,然后以完全准确的方式打印它,您将不会得到相同的数字。这是因为转换基数之间的小数通常不是精确的(这与 1/3 具有无限小数扩展 0.33... 时得到的效果类似)。示例:

double pi = 3.141592;
std::cout << std::setprecision(100) << pi << std::endl;

我的输出:

3.14159200000000016217427400988526642322540283203125

所以当你开始在你的问题代码中将它乘以 10 时,你会发现它在很长一段时间内都没有变成一个精确的整数(到那时它已经远远超出了 int 的范围) ),所以你的条件永远不会为真(要么有小数部分,要么 double 太大而不适合整数)。

换句话说,您所问的直接从 double 计算数字是没有意义的。您首先需要将其打印为字符串,否则您实际上没有要计算的小数位数。当然,您可以对其进行微优化,并跳过实际转换为 ASCII 或 UTF-16 字符串的过程,但我看不到值得为此付出努力的场景(除非作为学习练习)。

如果您在计算中需要精确的十进制数字,则需要一种特殊的数字类型,它不以二进制形式存储分数。这种数字类型的例子是 Java BigDecimal .

关于c++ - 如何计算 double/float C++ 中的位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36134004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com