gpt4 book ai didi

c - Labwindows 在添加 DOUBLE 数字时出现奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 17:46:32 24 4
gpt4 key购买 nike

我正在计时器的 CALLBACK 函数内运行以下代码块。

if (start_value <= end_value) 
{
start_value += increment_value;
}
else
{
return 0;
}

所有三个变量都定义为 DOUBLE。

Double start_value = 26.0;
Double end_value = 28.0;
increment_value = 0.1;

当将increment_value与start_value相加时,变量start_value的值并不简单地反射(reflect)相加的预期结果。例如,当start_value为26.0时,经过一次加法后,start_value的值为26.10000000001。尾随 1 会导致稍后的代码出现问题,因为当比较的预期结果预计为 TRUE 时,由于尾随 1,结果会被评估为 false。为什么会发生这种情况?

最佳答案

峨山 ==运算符正在寻找精确匹配,并且应该专门用于整数比较(其中精确是可能的)。那么,“为什么会发生这种情况?”因为 26.10000000001 不等于 26.1。两者之间的差异有时称为浮点误差。

只要我们使用浮点的二进制存储,就会继续存在浮点错误。这要求比较 float 的方法必须与比较整数时不同。 (即对于 float ,不能使用 (x == y) ? 。比较 float 时,“==”的一种快速而肮脏的替代方法是执行以下操作: if(abs(x-y)<epsilon ){//equal} 其中 epsilon 是一些小的容差值,例如 0.000001

所以,尝试这样的事情:

int main(void)
{
double start_value = 26.0;
double end_value = 28.0;
double increment_value = 0.1;

#define EPSILON 0.000001

while(fabs(start_value-end_value)>EPSILON )
{
printf("not equal\n");
start_value += increment_value;
}
printf("equal\n");
getchar();
}

注意: 选择 epsilon 值来匹配您将进行的比较中有效数字的邻域。

还有许多其他好的方法(很多人会说这不是其中之一),但我已经使用这个方法很多年了,并且就我的目的而言,它效果很好。
HERE 是一个稍微讨论这个以及其他方法的链接。

关于c - Labwindows 在添加 DOUBLE 数字时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19226677/

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