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

标签 c++ math fractions

我正在尝试计算 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/

相关文章:

c++ - 为什么不将比较因素纳入 Big O 计算?

c++ - 模板类的自动内存池功能

javascript - 使用 JavaScript 进行三 Angular 函数计算

c++ - 使用 std::future 和 std::async 的依赖项求解器

c++ - 用户提供我可以在 LLVM Pass 中解析的 LLVM 指令集的简洁方法

c - 使用递归函数编写数学程序

javascript - 以最少的拼接数量将一个阵列转换为另一个阵列

python - 如何编写一个函数来接受 SWIG 中的 Fraction 对象?

python - 在 Python 的 Fraction 模块中使用 numpy 向量元素

java - 小数java