2015-10-06 74 views
1

所以我想知道,如果步长小于1,我如何确保循环中的所有步骤都执行?就拿这个循环,例如:C环的步长小于1

for (float y, x = -1.0; x <= 1.0; x += 0.1) {   
    y = (4*x*x*x) + (3*x*x) + (5*x) - 10; 
    printf("x = %.2f, y = %.2f\n", x, y); 

} 

输出:

x = -1.00, y = -16.00 
x = -0.90, y = -14.99 
x = -0.80, y = -14.13 
x = -0.70, y = -13.40 
x = -0.60, y = -12.78 
x = -0.50, y = -12.25 
x = -0.40, y = -11.78 
x = -0.30, y = -11.34 
x = -0.20, y = -10.91 
x = -0.10, y = -10.47 
x = 0.00, y = -10.00 
x = 0.10, y = -9.47 
x = 0.20, y = -8.85 
x = 0.30, y = -8.12 
x = 0.40, y = -7.26 
x = 0.50, y = -6.25 
x = 0.60, y = -5.06 
x = 0.70, y = -3.66 
x = 0.80, y = -2.03 
x = 0.90, y = -0.15 

我打算回路也为X = 1运行,但你可以看到它并没有做到这一点。我听说使用浮点数作为循环计数器是不安全的,因为float精度不准确。我使用浮点变量作为循环计数器的事实可能是我的问题的原因。那么,我的问题有哪些解决方案?预先感谢您的好评!

回答

1

正如你所说的,问题是你不应该使用浮点数作为循环计数器。因此,由10个使用整数相乘的一切:

for (int x = -10; x <= 10; ++x) { 
    float y = (0.004*x*x*x) + (0.03*x*x) + (0.5*x) - 10; 
    printf("x = %.2f, y = %.2f\n", 0.1*x, y); 
} 

产地:

x = -1.00, y = -16.00 
x = -0.90, y = -14.99 
x = -0.80, y = -14.13 
... 
x = 0.90, y = -0.15 
x = 1.00, y = 2.00 

预期。

也许更好:从有意义的东西上逻辑上分离你的循环变量。

for(int i = -10; i <= 10; ++i) { 
    float x = 0.1 * i; 
    float y = (4*x*x*x) + (3*x*x) + (5*x) - 10; 
    printf("x = %.2f, y = %.2f\n", x, y);  
}