※ 引述《baobao566 (宝宝)》之铭言:
: 为了这个问题困扰了许久,不断地查资料,查完这个观念,又看到新的名词与此题
: 有关联。以我查到的资料VB.Net在浮点数运算时会将数字以IEEE754来标准来做,默认的
: 浮点数型态是Double,所以是64位,有误差是因为将他转成2进制,小数部分如果无限
: 循环,取到53位往最靠近的舍入(Round to nearest),二进制的这个模式我不太懂,
: 翻资料查到的大概又都是英文...。
不管是哪个程式、电脑环境,浮点数都是使用IEEE754去做的
也就是说,全世界的电脑都有误差问题
float 1 sign + 8 exponent + 23 mantissa
double 1 sign + 11 exponent + 52 mantissa
sign 正负号 0为正 1为负
exponent 指数
mantissa 小数点
举个例子:0.625
先转成二进制
2^0 2^-1 2^-2 2^-3 2^-4......
0 . 1 0 1 0 ......(省略不写)
0.625 (10) = 0.101 (2)
把2进位用科学记号表示
2^0 * 0.101
2^-1 * 1.01
放进 float 里面
sign 正 0
exponent -1+127 这里要加上 127 才能变成float exponent
double 就加上 1023
mantissa 0100000000...
合起来就变成
0 01111110 01000000000000000000000
01111110 是 126 的二进制
IEEE754 简介大致到这里
因为这只能用在二进制才会有精确性
可以用 0.1 跟 0.2 转成 IEEE754 格式
https://www.h-schmidt.net/FloatConverter/IEEE754.html
把0.1+0.2加起来问问看电脑是不是等于0.3?
: 还有一些环境的因素,我看到一个文件上面说编译器可能会帮你最佳化运算式,
: 例如说x = a+b-a -> x = b,那这题有很多环境的问题,我要如何判断呢?
: (出处:https://goo.gl/oAzyNB Compiler Optimization)
根据小弟在C++的经验,这要去改编译器的参数
因为这是在编译时帮你优化的
是自动帮你省略一些系统觉得没必要的动作
只能知道某些动作被优化
: 如果判断此题需要手算,请问有无快速手算判断的方法?此题是今年高职技艺竞
: 赛的程式设计赛前模拟学科试题,有想过他可能只是出经典范例来考你知不知道浮点
: 数有误差,如果只是这样就太好了,但是以防万一还是有个准确判断的方法比较安心。
: