首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求问一个基本有关问题,浮点数的乘除法、开方的计算机计算步骤

2013-08-04 
求问一个基本问题,浮点数的乘除法、开方的计算机计算步骤本帖最后由 zilaishuichina 于 2013-07-17 09:47:4

求问一个基本问题,浮点数的乘除法、开方的计算机计算步骤
本帖最后由 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汇编指令集都不一样。
[解决办法]

引用:
现在的浮点数操作都是CPU直接完成的。而且现在的x86-64好像浮点协处理器已经合并到SIMD的处理器里面了,没有单独的浮点协处理器。


FPU仍然存在。SIMD指令,MMX、SSEn、AVX、FMA等等,只能做简单运算,最复杂也就是开平方了,超越函数都算不了,仍然要靠FPU。


[解决办法]
对于浮点数一般来讲
// 1
c = a/b;
a = b*c;
// 2
后,1,2 两点的 a 可能会不同,所以不要依赖这种行为。
[解决办法]
引用:
Quote: 引用:

IEEE 浮点数,float ,32 位浮点数,1位符号,8位指数,23位尾数---其中,1位隐藏位;
对于16位无符号整数1~65535,带符号-32768~32768 这些整数,都可以精确表示;
不过计算时,就不好说了。计算结果,除非是(22位以内)整数加减,否则不一定正确。
IEEE 浮点数,double,64 位浮点数,1位符号,15位指数,53位尾数---其中,1位隐藏位;
32位 无符号整数,带符号整数,可以精确表示。
整数加减计算结果,也没问题(不能一直连续加,或者连续减,溢出就会不精确了),乘除则不能保证正确
  


那对于 1.0f * 1000 / 1000.0f
这个计算应该是22位以内可以精确表示的计算吧

所以我才求问计算机对浮点数的计算步骤
是不是计算步骤的过程中产生了22位以内无法表示的中间值


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。

热点排行