iT邦幫忙

0

c++數值問題

  • 分享至 

  • xImage

在寫學校作業時發現一個蠻奇怪的問題,但是我也不知道是不是自己哪裡寫錯了,請各位大大幫我看一下為甚麼輸出結果會是這樣

程式碼如下:
#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??
麻煩大家了~~

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
淺水員
iT邦大師 6 級 ‧ 2021-07-28 01:06:16
最佳解答

浮點數多次累加的話,誤差會累積
1.99997 + 0.0001 = 2.0007 會大於 2

如果沒規定要用迴圈去跑
可以直接這樣算 https://chart.googleapis.com/chart?cht=tx&amp;chl=x%3D10%5E%7B%5Cdisplaystyle%5E%7B%5Clog%7By%7D%7D%2F_z%7D

#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;
}

淺水員 iT邦大師 6 級 ‧ 2021-07-28 02:03:04 檢舉

如果從原發問的程式去改
把連續加法改成用乘法的話
算出來就會準確很多

#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;
}

我要發表回答

立即登入回答