Re: [問題] int()的奇怪現象
※ 引述《yongtw123 (六円)》之銘言:
: #include <iostream>
#include <stdio.h>
: #include <cmath>
: #include <string>
: using namespace std;
union T
{
double d;
unsigned int i[2];
};
: int main()
: {
: int m, x, y, z;
T t;
: input:
: cout<<"input: ";
: cin>>x>>y>>z;
: cin.get();
: if (x<0)
: goto input;
: if (y<0)
: goto input;
: if (z==0)
: goto input;
: m = int((4.0/7)*(pow(y,1.75)-pow(x,1.75))+(8.0/z));
: cout<<m<<endl;
t.d = (4.0/7)*(pow(y,1.75)-pow(x,1.75))+(8.0/z);
cout<<t.d<<endl<<endl;
printf("%-20.18lf = 0x%08X%08X\n", t.d, t.i[1], t.i[0]);
t.d = 1.0;
printf("%-20.18lf = 0x%08X%08X\n", t.d, t.i[1], t.i[0]);
: system("pause");
: return(0);
: }
: 兩個奇怪現象:
: 1. 輸入1 1 8
: 得1
: 但是輸入2 2 8
: 得0
: (兩者應該一樣的)
: 2. 第三個數字輸入0
: 程式並不會跳到input重來
: PS: 加cin.get()是因為之後還要加cin.getline()
: 想要請問是哪裡的問題
: 毫無頭緒...
: 先感謝~
把小弟穿插在您的code中間的程式碼加進去您的試試....
PS. 用printf是因為小弟跟cout不熟, 如果您cout用得很熟練....
可以自行用您習慣的格式化輸出看結果應該也沒關係....
==
簡單的說結論, 精確度的問題, cout同樣輸出了1.0給你看....
但是存在記憶體裡的那64 bits未必真正是存了1.0真正的IEEE 754表示式....
因為cout預設輸出的小數位數, 讓它自動幫你做了四捨五入....
小弟我用printf強制指定小數位數, 才勉強能夠凸顯它的差異來....
double的mentisa有52 bits, 換算十進位約15位的有效位數....
所以0.(十個9), 不特別指定輸出位數四捨五入起來都像是1....
但是只要它真的不到1, int()下去就會全部被強制捨棄小數位掉....
--
題外話, 如果這兩組input是老師特別要求測試的....
那這老師還滿不錯的, 馬上給您一個浮點精確問題的震撼教育:)
另外, 這種取整數化的誤差問題, 也有個簡單又常見的解法....
這個就給您自己稍微想想看怎麼在整數化時四捨五入吧XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.66.243.96
※ 編輯: VictorTom 來自: 61.66.243.96 (02/27 13:11)
※ 編輯: VictorTom 來自: 61.66.243.96 (02/27 13:11)
→
02/27 13:23, , 1F
02/27 13:23, 1F
推
02/28 09:17, , 2F
02/28 09:17, 2F
→
02/28 09:49, , 3F
02/28 09:49, 3F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
84
218