C - 比较浮点数和 if 语句
C - Comparing floats with if statements
我目前正在写一个贪心算法,但是我在比较浮点数时偶然发现了一个问题。
我会使用这样的代码:
float f = 0;
if (f == 0) {
// code
}
我已经在一个单独的程序上测试过它并且运行良好,但在我正在处理的程序上却没有。
这是我自己的程序的摘录。
float chf2 = fmod(chf, 0.1);
float ch3 = chf - chf2;
if (chf2 == 0) {
/* Divide user's number by 0.1 */
float ch3 = chf / 0.1;
/* Round the number */
int ch4 = round(ch3);
/* Print the amount of coins and end */
printf("%d\n", ch4 + coin2);
return 0;
}
奇怪的是,这似乎适用于先前的 if 语句,该语句检查用户输入的 fmod 何时为 0.25。
有没有更好的方法来检查一个浮点数是否等于另一个浮点数?
您的代码工作正常。但是,您的期望可能需要稍微调整一下。
fmod
函数总是 returns 一个精确的结果---当你写 c = fmod(a, b)
时,c
是一个数字,使得 c + k*b
(计算无限精度)对于某个整数 k
正好等于 a
。所以你的代码实际上是正确的---if (c == 0)
将在 a
恰好是 b
.
的倍数时触发
你把b
当成了double
0.1
,其实是分数3602879701896397/36028797018963968
,不是分数1/10
。因此,如果我计算 fmod(1, 0.1)
,我应该期望得到分数 (36028797018963968 % 3602879701896397) / 36028797018963968
,即 3602879701896395 36028797018963968
。这比称为 0.1
的 double
略小。
这也解释了为什么当您使用 0.25
而不是 0.1
时,您的代码符合您的期望; 0.25
正好给你 1/4。
您可以阅读 this floating-point guide 以了解浮点数的表示。
我目前正在写一个贪心算法,但是我在比较浮点数时偶然发现了一个问题。
我会使用这样的代码:
float f = 0;
if (f == 0) {
// code
}
我已经在一个单独的程序上测试过它并且运行良好,但在我正在处理的程序上却没有。
这是我自己的程序的摘录。
float chf2 = fmod(chf, 0.1);
float ch3 = chf - chf2;
if (chf2 == 0) {
/* Divide user's number by 0.1 */
float ch3 = chf / 0.1;
/* Round the number */
int ch4 = round(ch3);
/* Print the amount of coins and end */
printf("%d\n", ch4 + coin2);
return 0;
}
奇怪的是,这似乎适用于先前的 if 语句,该语句检查用户输入的 fmod 何时为 0.25。
有没有更好的方法来检查一个浮点数是否等于另一个浮点数?
您的代码工作正常。但是,您的期望可能需要稍微调整一下。
fmod
函数总是 returns 一个精确的结果---当你写 c = fmod(a, b)
时,c
是一个数字,使得 c + k*b
(计算无限精度)对于某个整数 k
正好等于 a
。所以你的代码实际上是正确的---if (c == 0)
将在 a
恰好是 b
.
你把b
当成了double
0.1
,其实是分数3602879701896397/36028797018963968
,不是分数1/10
。因此,如果我计算 fmod(1, 0.1)
,我应该期望得到分数 (36028797018963968 % 3602879701896397) / 36028797018963968
,即 3602879701896395 36028797018963968
。这比称为 0.1
的 double
略小。
这也解释了为什么当您使用 0.25
而不是 0.1
时,您的代码符合您的期望; 0.25
正好给你 1/4。
您可以阅读 this floating-point guide 以了解浮点数的表示。