gpt4 book ai didi

c++ - 比较 int 和 double 时出错

转载 作者:行者123 更新时间:2023-11-28 00:03:08 27 4
gpt4 key购买 nike

我正在尝试制作一个简单的函数来计算位数。我写了一些可以完美运行的功能,但我坚持使用这个功能:

// The number I want to count the digits after the decimal
long double d=33.56;
// Going to modify d but I wan't to keep the original value
long double dTemp=d;
// v to store the part after the decimal and e the part before
long double v, e;

v=modfl(dTemp,&e);

// j is the number of digit after the decimal
int j=0;
while(dTemp!=e)
{
j++;
dTemp*=10;
v=modfl(dTemp,&e);
std::cout<<"D = "<<dTemp<<" e = "<<e<<" v = "<<v<<std::endl;
}
std::cout<<"J = "<<j<<std::endl;

输出是:

D = 335.6 e = 335 v = 0.6
D = 3356 e = 3356 v = 2.27374e-13
D = 33560 e = 33560 v = 2.27374e-12
D = 335600 e = 335600 v = 2.27374e-11
D = 3.356e+06 e = 3.356e+06 v = 2.27374e-10
D = 3.356e+07 e = 3.356e+07 v = 2.27374e-09
D = 3.356e+08 e = 3.356e+08 v = 2.27301e-08
D = 3.356e+09 e = 3.356e+09 v = 2.27243e-07
D = 3.356e+10 e = 3.356e+10 v = 2.27243e-06
D = 3.356e+11 e = 3.356e+11 v = 2.27094e-05
D = 3.356e+12 e = 3.356e+12 v = 0.000226974
D = 3.356e+13 e = 3.356e+13 v = 0.00226974
D = 3.356e+14 e = 3.356e+14 v = 0.0227051
D = 3.356e+15 e = 3.356e+15 v = 0.227051
D = 3.356e+16 e = 3.356e+16 v = 0.269531
D = 3.356e+17 e = 3.356e+17 v = 0.6875
D = 3.356e+18 e = 3.356e+18 v = 0
J = 17

但是,如果您查看输出的第 2 行,您会:

D = 3356 e = 3356 v = 2.27374e-1

因此,dTemp 等于 e,while 循环仍在继续。

我尝试了什么:

  • 虽然我可能是因为无法存储所需的大数字。这就是我使用 long double 的原因

    • 我尝试了不同类型的变量,但我总是得到相同的结果。

最佳答案

直接检查 float/double/long double 数的等式/非等式不是一个好习惯。所以我建议使用这样的东西

不等于:

while (abs(dTemp - e) > 1e-12) { ... }

等于:

while (abs(dTemp - e) < 1e-12) { ... }

“微小”数字取决于非整数的类型( float 或固定精度实数)。 M-Gregoire 关于使用 std::numeric_limits<double>::epsilon() 的评论听起来不错,但可能会再次遇到问题。由于 33.56 不能计算为 2 的正幂和/或负幂的有限和,因此无法存储!总是有细微的差别。在内部它是这样存储的:33.56000000000000227373675443232059478759766 (我在 中打印,但在 中得到类似的结果)。所以你可以将这个“微小”的差异值设置为一个“合适的”值,这个值足够高以解决这个内部浮点格式问题。

您可以使用其他方法。一个std::ostringstream可与机械手一起使用 setprecision将精度设置为“正确的”数字以将数字转换为字符串,然后计算字符串中的数字。但这也不是那么简单。

我检查了 中的值“33.56”以及。查看示例代码:

#include <iostream>
#include <iomanip>

int main() {
float df = 33.56;
double dd = 33.56;
long double dld = 33.56;
std::cout << std::setprecision(50) << df << std::endl;
std::cout << std::setprecision(50) << dd << std::endl;
std::cout << std::setprecision(50) << dld << std::endl;
}

输出是:

33.560001373291015625
33.56000000000000227373675443232059478759766
33.56000000000000227373675443232059478759766

因此,在 float 1e-5 的情况下,间隙值可以使用,因为在这种情况下,double 1e-14 似乎是正确的值。

关于c++ - 比较 int 和 double 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37430488/

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