【发布时间】:2015-02-06 09:12:56
【问题描述】:
在 x64 架构上运行,Visual Studio 2013 Windows 8.1
我正在尝试运行一个使用浮点数作为其循环变量的循环,问题是在增量操作期间十进制值正在丢失。
例如:
float incrementValue = 360 / 14;
for (float i = 0; i <= 360; i = i + incrementValue)
{
cout << endl << " I " << i;
}
我需要 i >= 360 的值。但它停在 350 。 由于 360/14 =25.7142857 但看起来增量是 25 的步骤。 如果我对任何整数做同样的事情,它就可以正常工作,这个问题只适用于 xx.yyyy 形式的任何数字
我尝试查找有关此问题的各种网站,但找不到任何可以帮助我/回答我的问题的内容。
【问题讨论】:
-
360 / 14会将25.0分配给您的变量。使用360.0 / 14.0分配25.7142857。 -
这并不能回答这个问题,但是由于浮点精度问题,无论如何使用
for循环从我看到的地方开始浮点增量是一个坏主意。我宁愿使用while -
使用浮点值作为循环增量没有任何问题,只要您知道几件事。首先,由于精度误差,迭代次数可能会有所不同,因此您的 +-1 可能会超出您的预期。其次,出于与上述相同的原因,直接测试浮点值是否相等是不可靠的,您应该测试该值是否在某个“可接受”范围内。
-
@Lionel
There is nothing wrong with using floating point values as a loop increment他们不同意 - securecoding.cert.org/confluence/display/seccode/… -
@PaulMcKenzie 好吧,“没什么错”可能太强了。 :) 也许“可以考虑使用它”会更合适。
标签: c++ computer-science