在寫學校作業時發現一個蠻奇怪的問題,但是我也不知道是不是自己哪裡寫錯了,請各位大大幫我看一下為甚麼輸出結果會是這樣
程式碼如下:
#include
#include
using namespace std;
int main() {
int a;
int b;
float c[10];
cout << "請使用者分別輸入兩個整數y和z,程式會計算出滿足[x的z次方等於y]的x\n";
cin >> a;
cin >> b;
float x=1;
for (float i = 1; i <= a; i=i+0.0001) {
x = 1;
for (int j = 1; j <= b;j++ ) {
x =x *i;
}
if (x <= a) {
c[0] = i;
}
}
cout << "x等於:" << c[0] << "\n";
system("pause");
}
///////////////////////
輸出結果:
請使用者分別輸入兩個整數y和z,程式會計算出滿足[x的z次方等於y]的x
8
3
x等於:1.99997
///////////////////////
在寫學校作業時發現一個蠻奇怪的問題,但是我也不知道是不是自己哪裡寫錯了,請各位大大幫我看一下為甚麼輸出結果會是這樣
我想問的是,為甚麼輸出結果不是2??
麻煩大家了~~
浮點數多次累加的話,誤差會累積
1.99997 + 0.0001 = 2.0007 會大於 2
如果沒規定要用迴圈去跑
可以直接這樣算
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int y;
int z;
cout << "請使用者分別輸入兩個整數y和z,程式會計算出滿足[x的z次方等於y]的x\n";
cin >> y;
cin >> z;
cout << "x等於:" << pow(10.0, log10((float)y) / (float)z) << "\n";
return 0;
}
如果從原發問的程式去改
把連續加法改成用乘法的話
算出來就會準確很多
#include <iostream>
using namespace std;
int main()
{
int a;
int b;
float c[10], t;
cout << "請使用者分別輸入兩個整數y和z,程式會計算出滿足[x的z次方等於y]的x\n";
cin >> a;
cin >> b;
float x = 1;
//把累加改成直接乘出來
for (int i = 0; (t = 1 + 0.0001 * i) <= a; ++i)
{
x = 1;
for (int j = 1; j <= b; j++)
{
x = x * t;
}
if (x <= a)
{
c[0] = t;
}
}
cout << "x等於:" << c[0] << "\n";
return 0;
}