c语言float和double混用,C语言中float和double的问题。

  • Post author:
  • Post category:其他


满意答案

02ae427d08e371d7e90d5b995e828d6d.png

efshxl

2014.05.12

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:54%    等级:9

已帮助:9414人

这样验证没有问题。

有效位数并不是整数,一定是回6位或一定是7位。实际上,它可能是 2 的某个答次方分之一。

所以,它并不是10的整数倍分之一。

32位单精度:M段是23位,则精度为:1/2^23 = 0.0000001192092895

精度大致为 7 位

64位单精度:M段是52位,则精度为:1/2^52 = 2.2204460492503e-16

精度大致为 16 位

书上说,6-7位,15到16位,只是大概范围,并不表示在不同电脑上有差别。

如果你有兴趣,可以了解一下 IEEE 浮点数的规则。S,E,M 三段,其中 M 段的位数,表示了其精度。S是符号位,E是指数位。

至于数据类型的精度,其主要与你的平台有关。Win32 平台下,如果使用IEEE浮点数的编译器,编译出来的程序,其精度就是书上所说。

某些编译器可能可以设置为 IBM 浮点数规则。或者某些平台是 64 位的,那么某些 64 位编译器可能支持更长的数据类型,其精度可能会有所提高。追问: 那上述我的结果显示的,我的电脑的这个系统的配置,用这款软件。float 和 double 的有效数分别是几位呢?就“仅”根据我的结果来看。

追答:请认真看我列出的式子。

追问: 就只针对“截图所示的那一刻,只针对那一个截图”。float 和 double 分别是多少?

追答:好吧,我重复一遍!

不管多少进制:

能表达的最小数 = 1 / (进制 ^ 有效位数 )

float 是32位IEEE浮点数,其 M 段是 23 位,则二进制有效位数是23。

于是:能表达的最小数 = 1 / ( 2 ^ 23 )

你想要知道这个数在十进制里的有效位数。反过来算:

能表达的最小数 = 1 / ( 10 ^ 十进制有效位数 ) = 1 / ( 2 ^ 23)

则 十进制有效位数 = log( 2 ^ 23 ) = 6.9236899

(64位类同,把 23 改成 52 既可)

所以,书上说,有效位数是 6 到 7。

会算了么?

它与你的实例没有关系,不管任何时候,只要是 32位IEEE浮点,其有效位数就是这么大。它不是一个整数。

请不要继续追问我,针对你的截图的那一刻是多少。

00分享举报