![]() |
1
28
x87的最大问题基本上是所有寄存器操作都是在80位中完成的,而大多数时候人们只使用64位浮点(即双精度浮点)。所发生的是,将64位浮点加载到x87堆栈中,然后将其转换为80位。在80位中对它执行一些操作,然后将其存储回内存,并将其转换为64位。与仅使用64位执行所有操作相比,您将得到不同的结果,并且使用优化编译器时,一个值可能经过的转换次数非常不可预测,因此在执行回归测试时很难验证您是否得到了“正确”的答案。 另一个问题仅从编写程序集(或间接编写程序集,在为编译器编写代码生成器的情况下)的角度来看是重要的,即x87使用寄存器堆栈,而SSE使用可单独访问的寄存器。有了x87,你就有了一堆额外的指令来操作堆栈,我想Intel和AMD宁愿用SSE代码让他们的处理器运行得快,也不愿让那些额外的堆栈操作x87指令运行得快。 顺便说一句,如果你有不准确的问题,你会想看看这篇文章 What every programmer should know about floating-point arithmetic |
![]() |
2
5
应该有一些类型可以用来捕获和替换公共子表达式
不改变程序的语义。不幸的是,ansic未能指定任何可用于
事实上,扩展精度类型在没有浮点单元的平台上的价值与在x87处理器上的价值一样,因为在这种处理器上,像x+y+z这样的计算需要以下步骤:
使用扩展精度类型可以消除步骤4、5和6。由于53位尾数太大,无法容纳少于四个16位寄存器或两个32位寄存器,因此使用64位尾数执行加法并不比使用53位尾数慢,因此使用扩展精度数学可以提供更快的计算速度,而且没有任何缺点 在一种支持适当类型以保存临时结果的语言中 . 没有理由责怪英特尔提供了一个FPU,可以执行浮点数学的方式,这是过去的 也 非FPU芯片上最有效的方法。 |
![]() |
3
3
始终使用80位中间算法,如果你可以摆脱它的速度明智。如果这意味着您必须使用x87数学,那么就这样做。对它的支持无处不在,只要人们继续做正确的事情,它就会无处不在。 |
![]() |
4
0
双精度比f80小11位(大约2.5个字节/位数),对于许多应用程序(主要是游戏)来说,这不会有什么坏处。但你将需要所有可用的准确性,比如说,太空计划或医疗应用程序。 当有人说f80(并被它劝阻)在堆栈上运行时,这有点误导。FPU的寄存器和操作类似于堆栈操作,也许这让人摸不着头脑。它实际上是基于内存的(加载/存储),而不是堆栈本身,例如,与调用cdecl stdcall这样的约定相比,cdecl stdcall实际上通过堆栈传递参数。没什么不对的。
对于游戏和普通的简单应用程序(几乎所有),你只需使用两次就不会有人死亡。但对于一些严肃的数学或科学应用程序来说,你不能抛弃f80。 |
|
Rik Bloemers · for循环不接受任何浮点变量 3 年前 |
![]() |
zell · 为什么存储7个浮点数需要34字节? 3 年前 |
![]() |
Atharva Sunil Sathe · 如何删除任意数的小数点? 3 年前 |
![]() |
user1658887 · 为什么**2!=a*a一些彩车? 7 年前 |