作者VictorTom (鬼翼&娃娃鱼)
看板C_and_CPP
标题Re: [问题] int()的奇怪现象
时间Fri Feb 27 13:06:11 2009
※ 引述《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)
1F:→ VictorTom:顺便给个建议, 不要太习惯於使用goto比较好^^|| 02/27 13:23
2F:推 vip82:应该是根本就不要用goto 02/28 09:17
3F:→ james732:适当的使用是可以的,但原po的使用并不算适当...XD 02/28 09:49