1

ステップ サイズが 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 の精度が正確ではないため、float をループ カウンターとして使用するのは安全ではないと聞いたことがあります。ループ カウンターとして float 変数を使用していることが、おそらく問題の原因です。では、私の問題にはどのような解決策がありますか? 親切なご回答ありがとうございます。

4

1 に答える 1

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);    
}
于 2015-10-06T09:47:04.960 に答える