这个double数字为什么小数有16位

liuzu2016 2013-05-09 02:12:36

int _tmain(int argc, _TCHAR* argv[])
{
double lfVal=3.95396678912345973;
return 0;
}


16位,我是调试状态下,观察变量得到的。

不是说至少保证15位嘛

很少有16位的,


谁能给一个 小数为15位的例子啊,
...全文
749 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2013-05-15
  • 打赏
  • 举报
回复 1
我的意思是double用52bit表示小数,2^-52 = 0.000000000000000222044604925, 只能逼近到10进制16位,所以一般说保证15位准,至于看到打印出几位,那是人为硬性规定,譬如 // 1 + 2^(-15) 1.000030517578125 真15位准,vc还是要显示16位,多补个0,按你的说法15位不够不得已加上一位? // 1 + 2^(-16) 1.0000152587890625 真准16位,按你说法看到第16位是近似值不准的?
liuzu2016 2013-05-15
  • 打赏
  • 举报
回复
引用 11 楼 angel_su 的回复:
你的例子不就是,看到小数16那是硬性打印出来,15位准确...
我哭了,我觉得你搞错了吧 16位是指:一个双精度数字,15位依然无法精确表示,不得不加上一个一个近似位。 15位是指:15位就可以精确表示了。 请对比 浮点数的6, 7位。 也是这么解释的
bluewanderer 2013-05-14
  • 打赏
  • 举报
回复
double能保证几位有效数字其实就是二进制小数有效数字第53位最少能影响到十进制小数有效数字的第几位,进一步就是十进制表示时,double的53位有效数字最多有几位需要被当作整数部分使用(这个位数不是整数),于是第53位最终究竟是小数点后第几位(这个最后也不是整数)。 印象中老谭算错了,或者他根本没算,只是随便从什么地方抄了结果。
liuzu2016 2013-05-14
  • 打赏
  • 举报
回复
引用 8 楼 liuzu2016 的回复:
[quote=引用 7 楼 baichi4141 的回复:] double保证15到16位有效数字,不是15到16位小数 直接写在代码里的字符串不管多长都无所谓,编译器将之转换为内存数据的时候能够保证的就只有前15到16位 准确的说,double可以表示任意位数的十进制数值,但从第17位后的数字是无意义的,它的内容由前16位和小数点位置决定 建议楼主了解一下浮点数在内存中的表示方法,而不是在这里空想什么15位16位
纠正: 换算成10进制的科学计数法的16位-17位 小数,是这样算的。 第2: 我所谓的观察是把光标放到变量哪里,看到的显示16位。 好吧,我就当作这是vs的一个 引我误入歧途的 地方吧。 [/quote] 第3: 谁能给一个 小数为15位的例子啊,
liuzu2016 2013-05-14
  • 打赏
  • 举报
回复
引用 7 楼 baichi4141 的回复:
double保证15到16位有效数字,不是15到16位小数 直接写在代码里的字符串不管多长都无所谓,编译器将之转换为内存数据的时候能够保证的就只有前15到16位 准确的说,double可以表示任意位数的十进制数值,但从第17位后的数字是无意义的,它的内容由前16位和小数点位置决定 建议楼主了解一下浮点数在内存中的表示方法,而不是在这里空想什么15位16位
纠正: 换算成10进制的科学计数法的16位-17位 小数,是这样算的。 第2: 我所谓的观察是把光标放到变量哪里,看到的显示16位。 好吧,我就当作这是vs的一个 引我误入歧途的 地方吧。
baichi4141 2013-05-14
  • 打赏
  • 举报
回复
double保证15到16位有效数字,不是15到16位小数 直接写在代码里的字符串不管多长都无所谓,编译器将之转换为内存数据的时候能够保证的就只有前15到16位 准确的说,double可以表示任意位数的十进制数值,但从第17位后的数字是无意义的,它的内容由前16位和小数点位置决定 建议楼主了解一下浮点数在内存中的表示方法,而不是在这里空想什么15位16位
angel_su 2013-05-14
  • 打赏
  • 举报
回复
你的例子不就是,看到小数16那是硬性打印出来,15位准确...
折翼断JJ 2013-05-13
  • 打赏
  • 举报
回复
不会出现16位吧。
liuzu2016 2013-05-13
  • 打赏
  • 举报
回复
引用 3 楼 buyong 的回复:
不是说至少保证15位嘛 16>15
谁能给一个 小数为15位的例子啊,
赵4老师 2013-05-09
  • 打赏
  • 举报
回复
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理,用二进制小数也不能精确表示某些10进制小数。 float.h
...
#define DBL_DIG         15                      /* # of decimal digits of precision */
#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG    53                      /* # of bits in mantissa */
#define DBL_MAX         1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP  308                     /* max decimal exponent */
#define DBL_MAX_EXP     1024                    /* max binary exponent */
#define DBL_MIN         2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP  (-307)                  /* min decimal exponent */
#define DBL_MIN_EXP     (-1021)                 /* min binary exponent */
#define _DBL_RADIX      2                       /* exponent radix */
#define _DBL_ROUNDS     1                       /* addition rounding: near */
...
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
buyong 2013-05-09
  • 打赏
  • 举报
回复
不是说至少保证15位嘛 16>15
hugett 2013-05-09
  • 打赏
  • 举报
回复
用printf("%.16lf\n", lfVal);输出来好像精度不够。。15还行。。
starytx 2013-05-09
  • 打赏
  • 举报
回复
printf("%.15lf\n" ,ifVal);

69,368

社区成员

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

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