【发布时间】:2016-10-19 14:56:36
【问题描述】:
我正在尝试用 C 编写一个程序来完成以下任务。
输入:三个双精度数,a、b 和 c。
输出:从b到a的所有数字,可以通过递减c来达到。
这是一个简单的程序(文件名:range.c)。
#include <stdlib.h>
#include <stdio.h>
int main()
{
double high, low, step, var;
printf("Enter the <lower limit> <upperlimit> <step>\n>>");
scanf("%lf %lf %lf", &low, &high, &step);
printf("Number in the requested range\n");
for (var = high; var >= low; var -= step)
printf("%g\n", var);
return 0;
}
但是,对于某些输入,for 循环的行为相当奇怪。比如下面这个。
10-236-49-81:stackoverflow pavithran$ ./range.o
Enter the <lower limit> <upperlimit> <step>
>>0.1 0.9 0.2
Number in the requested range
0.9
0.7
0.5
0.3
10-236-49-81:stackoverflow pavithran$
我无法弄清楚为什么循环在 var = 0.1 处退出。而对于另一个输入,它的行为符合预期。
10-236-49-81:stackoverflow pavithran$ ./range.o
Enter the <lower limit> <upperlimit> <step>
>>0.1 0.5 0.1
Number in the requested range
0.5
0.4
0.3
0.2
0.1
10-236-49-81:stackoverflow pavithran$
第一种情况下的奇怪行为是否与数值精度有关?
如何确保范围始终包含 floor((high - low)/step) + 1 个数字?
我尝试了另一种循环浮点数的方法,我将循环变量缩放为整数,并打印循环变量除以使用的缩放的结果。但也许有更好的方法......
【问题讨论】:
-
我认为问题需要澄清。减量应该是双算术还是实数算术?
标签: c for-loop floating-point