求助浮点数上溢下溢问题

suixinpiaodang 2013-10-01 07:02:14
关于C primer plus 第三章编程练习第一题的疑问。
整数的溢出弄明白了,但是对于浮点数的,还是有些不明白,麻烦有明白的讲一下。

#include<stdio.h>
int main(void)
{
int a = 2147483647;
float b = 3.40E+38;
float c = 10.0E-37f;
printf("the value of a is %d,the overflow of int is %d,the other is %d\n",a,a+1,a+2);
printf("the maxiest value of float is %e,the overflow is %e\n",b,b*10.0f);
printf("the minius value of float is %e,the overflow is %e\n",c,c/100);

return 0;
}
,结果是

浮点数倒也正常显示啊。。。我用的支持C99的编译器。。

如果把代码改成这样

#include<stdio.h>
int main(void)
{
int a = 2147483647;
float b = 3.40E+38*100.0f;

float c = 10.0E-37f/100;

printf("the value of a is %d,the overflow of int is %d,the other is %d\n",a,a+1,a+2);
printf("the maxiest value of float is %e,the overflow is %e\n",b,b*10.0f);
printf("the minius value of float is %e,the overflow is %e\n",c,c/100);

return 0;
}


结果是
上溢是正常的,下溢又不正常。。。这是什么原因呢?表示很疑惑。。
...全文
937 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
c090869 2013-10-06
  • 打赏
  • 举报
回复
float 型数据在内存中整数部份值通常为1,但如果该数据的绝对值小于2^-127, 整数部份的值可以为0,所以可以表示绝对值最小值是2^-143.
suixinpiaodang 2013-10-06
  • 打赏
  • 举报
回复
引用 5 楼 lm_whales 的回复:
数据比较小时,转换为非规格化表示,可以表示10.0E-37f/100; 10.0E-37f/10000; 没有下溢,也不是其他不可表示数据。 不是0 printf时候,转换为double 但是不影响,表示范围。 float 无穷大,转换为double还是无穷大。而不是可表示的数据。 同样NAN也还是NAN
,也就是说float不是在10.0E-37f/100,附近下溢了?thanks。。。书有问题啊。。。
suixinpiaodang 2013-10-02
  • 打赏
  • 举报
回复
难道在调用printf()时,float型的数值转换成了double型?
suixinpiaodang 2013-10-02
  • 打赏
  • 举报
回复
引用 1 楼 qq523176585 的回复:
float b = 3.40E+38; 编译时没有提示3.40E+38是一个const double 型的数据?
,没有提示啊。。。。
lm_whales 2013-10-02
  • 打赏
  • 举报
回复
float x=1; for(int i=0;i<128+40;i++) { TRACE("%e\n",x); x/=2; } 1.000000e+000 5.000000e-001 2.500000e-001 1.250000e-001 6.250000e-002 3.125000e-002 1.562500e-002 7.812500e-003 3.906250e-003 1.953125e-003 9.765625e-004 4.882813e-004 2.441406e-004 1.220703e-004 6.103516e-005 3.051758e-005 1.525879e-005 7.629395e-006 3.814697e-006 1.907349e-006 9.536743e-007 4.768372e-007 2.384186e-007 1.192093e-007 5.960464e-008 2.980232e-008 1.490116e-008 7.450581e-009 3.725290e-009 1.862645e-009 9.313226e-010 4.656613e-010 2.328306e-010 1.164153e-010 5.820766e-011 2.910383e-011 1.455192e-011 7.275958e-012 3.637979e-012 1.818989e-012 9.094947e-013 4.547474e-013 2.273737e-013 1.136868e-013 5.684342e-014 2.842171e-014 1.421085e-014 7.105427e-015 3.552714e-015 1.776357e-015 8.881784e-016 4.440892e-016 2.220446e-016 1.110223e-016 5.551115e-017 2.775558e-017 1.387779e-017 6.938894e-018 3.469447e-018 1.734723e-018 8.673617e-019 4.336809e-019 2.168404e-019 1.084202e-019 5.421011e-020 2.710505e-020 1.355253e-020 6.776264e-021 3.388132e-021 1.694066e-021 8.470329e-022 4.235165e-022 2.117582e-022 1.058791e-022 5.293956e-023 2.646978e-023 1.323489e-023 6.617445e-024 3.308722e-024 1.654361e-024 8.271806e-025 4.135903e-025 2.067952e-025 1.033976e-025 5.169879e-026 2.584939e-026 1.292470e-026 6.462349e-027 3.231174e-027 1.615587e-027 8.077936e-028 4.038968e-028 2.019484e-028 1.009742e-028 5.048710e-029 2.524355e-029 1.262177e-029 6.310887e-030 3.155444e-030 1.577722e-030 7.888609e-031 3.944305e-031 1.972152e-031 9.860761e-032 4.930381e-032 2.465190e-032 1.232595e-032 6.162976e-033 3.081488e-033 1.540744e-033 7.703720e-034 3.851860e-034 1.925930e-034 9.629650e-035 4.814825e-035 2.407412e-035 1.203706e-035 6.018531e-036 3.009266e-036 1.504633e-036 7.523164e-037 3.761582e-037 1.880791e-037 9.403955e-038 4.701977e-038 2.350989e-038 1.175494e-038 5.877472e-039 2.938736e-039 1.469368e-039 7.346840e-040 3.673420e-040 1.836710e-040 9.183550e-041 4.591775e-041 2.295887e-041 1.147944e-041 5.739719e-042 2.869859e-042 1.434930e-042 7.174648e-043 3.587324e-043 1.793662e-043 8.968310e-044 4.484155e-044 2.242078e-044 1.121039e-044 5.605194e-045 2.802597e-045 1.401298e-045 //float 最小可表示的数据 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000
lm_whales 2013-10-02
  • 打赏
  • 举报
回复
数据比较小时,转换为非规格化表示,可以表示10.0E-37f/100; 10.0E-37f/10000; 没有下溢,也不是其他不可表示数据。 不是0 printf时候,转换为double 但是不影响,表示范围。 float 无穷大,转换为double还是无穷大。而不是可表示的数据。 同样NAN也还是NAN
  • 打赏
  • 举报
回复
float b = 3.40E+38; 编译时没有提示3.40E+38是一个const double 型的数据?

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧