求问一个基本问题,浮点数的乘除法、开方的计算机计算步骤
本帖最后由 zilaishuichina 于 2013-07-17 09:47:43 编辑 如题,求解
另外是不是不同的CPU,计算步骤是不一样的?
最近在处理浮点数在不同的计算机上计算出来的结果有微小误差的问题
特此求解
[解决办法]
建议楼主从硬件设计方面去寻找根本性的答案,比如当前的FPGA芯片本身都有提供浮点数运算的IP,可以参考研究和仿真这些成熟的东东,引子http://www.altera.com.cn/literature/wp/wp-01116-floating-point_CN.pdf
[解决办法]
大概都是cpu来做的,386下应该是387浮点处理器,现在最新的不知道叫什么处理器了
[解决办法]
对不同体系的计算机来说可能不同把, RISC 的可能采用软件实现, CISC 的可能采用硬件实现.
x86 是 CISC 的 CPU, 是用硬件来实现的. 对应的汇编指令分别是 fmul, fdiv, fsqrt, 配合浮点寄存器使用.
[解决办法]
up一下。
应该是不一样的,不同cpu汇编指令集都不一样。
[解决办法]
FPU仍然存在。SIMD指令,MMX、SSEn、AVX、FMA等等,只能做简单运算,最复杂也就是开平方了,超越函数都算不了,仍然要靠FPU。
[解决办法]
对于浮点数一般来讲
// 1
c = a/b;
a = b*c;
// 2
后,1,2 两点的 a 可能会不同,所以不要依赖这种行为。
[解决办法]
0.001 大概不能精确表示吧,注意浮点是二进制格式的,不是10进制的。
这是除法 1.0/1000 结果是不精确的;
但是1.0f * 1000 / 1000.0f 结果是精确的。
PS:
这不能保证,所有这类计算,都是精确的。
[解决办法]
0x133f是设置FPU的控制寄存器的值,后面的0xffff代表设置的位,为1的bit会被设置(设置为第一个参数,如0x133f,中的相应bit),为0的bit不被设置(保持原控制字中的bit)。
0x133f和精度控制有关的是设置64位尾数有效数字(二进制),你也可以设置为0x037f。