问题标签 [fpu]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
802 浏览

c - 双倍的 Pow 实现

我正在开发一个用于运动控制的代码,但我遇到了 pow 函数的问题。我使用 VS2010 作为 IDE。

这是我的问题:我有:

在评估最后一个函数时,我没有得到更好的近似结果。我得到了正确的 7 位十进制数字,随后的数字都是垃圾。我猜 pow 函数只会将任何输入变量转换为浮点数并进行计算。

  1. 我对吗?
  2. 如果是这样,是否有任何代码可以让我得到“启发”来重新实现 pow 以获得更好的精度?

编辑:已解决。

毕竟,我遇到了由 OGRE 3D 框架使用的 Direct3D 引起的 FPU 配置位问题。

如果使用 OGRE,在配置 GUI 上,只需设置“Floating-point mode=Consistent”。

如果使用原始 Direct3D,在调用 CreateDevice 时,请确保将“D3DCREATE_FPU_PRESERVE”标志传递给它。

原帖:

您可能正在使用将 FPU 的默认精度更改为单精度的库。然后,所有浮点运算,即使是双精度运算,实际上都将作为单精度运算执行。

作为测试,您可以尝试调用 _controlfp( _CW_DEFAULT, 0xfffff ); (你需要包括)在执行计算之前,看看你是否得到正确的结果。这会将浮点控制字重置为默认值。请注意,它也会重置其他设置,这可能会导致问题。

一个改变浮点精度的常用库是 Direct3D 9(可能还有其他版本):默认情况下,它在创建设备时将 FPU 更改为单精度。如果使用它,请在创建设备时指定标志 D3DCREATE_FPU_PRESERVE,以防止其更改 FPU 精度。

0 投票
2 回答
1221 浏览

vba - 从 VBA 调用 dll 函数时出现浮点错误

这是情况。我正在使用 MS Visual Sturio 2005 和 Excel 2007。我创建了一个包含函数的 dll

这是从 Excel VBA 调用的。此功能似乎可以正常工作。但是有一个问题:当 VBA 从我的函数返回并尝试执行下一条浮点指令时,我看到一个窗口:

运行时错误 6. 溢出。

这个错误很奇怪。最近几天我一直在调查它,这是我收集的“事实”:

1) 错误仅在第一次调用 dll 后出现。对该函数的所有连续调用都不会导致此错误。

2)该错误是由控制从dll返回后VBA代码中的第一条(看似无害的)浮点指令触发的:

3) 构建 dll 的项目包含 4 个文件:mydll.cpp、mydll.def、cSomeClass.cpp 和 cSomeClass.h。

cSomeClass是一个相当复杂的类,它从我的其他库中调用代码。但mydll.cppcSomeClass以任何方式使用。这是代码mydll.cpp

的初始版本MyFunc()没有前 3 行(与 混淆的行_controlfp()),它是"Runtime Error 6, Overflow"在 VBA 中引起的。然后我开始怀疑这个错误可能与 FPU 寄存器有关(我对此知之甚少)。当我添加这 3 行时,我调用_controlfp()- 时引发了异常"0xC0000090: Floating-point invalid operation."。如果我保留上面显示的代码,异常会导致堆栈展开(我们没有到达该行),并且在 Excel 中显示VARIANT res;一个窗口。"runtime error 6. Overflow."综上所述,加上这3行导致更早抛出浮点异常。如果我们捕获第 3 行中抛出的异常(带有__except子句)并忽略它(通过 callng _clearfp()),那么 Excel 中不会报告错误。

一个讨厌的细节:如果我删除文件cSomeClass.cppcSomeClass.h从 Visual Studio 项目中删除,则不会重现错误。cSomeClass.h不包含在mydll.cpp中,但如果我cSomeClass.*从项目中删除文件,则 dll 大小会显着减小。

在这一点上,我最好的猜测是,LIB-s 中有一些静态对象被引用cSineClass.cpp,导致了这种情况。也许这些对象在加载 dll 时被初始化(构造)(根据我的实验,在 to 之前DllMain),这会以某种方式导致设置错误标志"0xC0000090: Floating-point invalid operation."。当我们从 dll 返回到 Visual Basic 时,somethis 调用_controlfp并启用浮点异常(它们在 С++ 中被关闭),当引发"0xC0000090: Floating-point invalid operation."以某种方式转换为"Runtime Error 6. Overflow."我在 Excel 中看到的时。这只是一个猜测。到目前为止,我还没有找到任何可以这样做的静态对象。

不幸的是,我无法创建一个重现此错误的小示例,因为它仅在我cSomeFile.*作为项目的一部分时才会出现。这些文件需要我所有的库......

如果有人知道这种行为的原因可能是什么,或者对如何推进我的调查有任何建议,我们将不胜感激。

0 投票
2 回答
268 浏览

assembly - 如果协处理器不存在,arm asm 中的条件协处理器操作是否有效?

指令是否像

当必要的协处理器可能不存在时,在 ARM 汇编中使用是否有效/安全,如果当前条件代码确保除非协处理器存在,否则不会执行操作?

0 投票
2 回答
315 浏览

assembly - 一些 intersectRaySphere c 程序通过将其重写为 x86 asm 进行优化(如何?)

你好,我对汇编的了解不多,我正在考虑如何通过在 x86(32 位 fpu 或 sse2)汇编中重写它来优化它,应该优化它 - 用正确的汇编重写,然后我会测试如果我加快了速度(length() 和 dot() 也应该在这里用 asm 编写)此代码由我的简单实时光线追踪器使用,它可以工作 - 但我在 asm 优化方面不太擅长)

先感谢您

//编辑

和演示 exe(在没有那么多优化的 c 中未优化):

dl.dropbox.com/u/42887985/re29.zip

也许有人可以给我一个有点好的 fpu asm 例程,用于长度点(或标准化未在此处显示)?虽然相交过程的整个过程是最好的;-)

0 投票
2 回答
9301 浏览

assembly - 如何将 ST(0) 移动到 EAX?

你好,我正在学习 x86 FPU 组装,我有一个简单的问题,我找不到答案:

如何将值从ST(0)(FPU 堆栈的顶部)移动到EAX

另外:
此代码是否正确:

0 投票
1 回答
206 浏览

assembly - 如何在 fpu 上反转除法 1/f?

抱歉这么简单的问题,(从几天开始学习组装)但我正在浏览书籍并找不到答案

什么是计算 1/f 的正确快速方法,其中 f 是 x86 fpu 上的一些浮点数

是吗

?

这是正确的(我的意思是字面意思是因为我不确定 fdivr args)还是某种最快最简单的方法?

//编辑

这是在经典 fpu asm 中 div 1/f (或 1/sqrt(f) 的最佳方法吗?(没有 sse,也没有 carmack 技巧 - 我将尝试 l8er,现在我正在尝试做 'proper fpu' )

0 投票
1 回答
787 浏览

assembly - asm (fpu) normalize - 如何优化它

我已经编写了一些 x86 asm - fpu 例程来规范化三个浮点数的向量 - 这里是

[这是我的代码 ;-) 它可以工作并经过我的测试]

我不太了解 x86 程序集,我想对上述内容进行一些优化(纯 fpu 旧 asm,尤其是没有 sse,但比上面更优化)

特别是我想知道上面这个东西是否有一些蹩脚的编码:我在 fpu 堆栈上加载 xyz 向量然后计数 1/sqrt(x*x+y*y+z*z) 然后再次从 ram 加载 xyz 然后乘以值店铺 -

这是次优化吗,我应该尝试只加载 xyz 一次(而不是两次),然后将其保持在 fpu 堆栈计数上,然后存储在末尾?

0 投票
1 回答
502 浏览

c - carmack 在 asm 中的 invsqrt

你好,我对asm没有太多经验,我想在汇编中重写carmack的倒平方根c例程

这是编译器生成的,但我想对其进行优化并重写为 asm 例程

(生成的此代码远非最佳 i 事物 - 将 fpu 与整数运算混合,也许有意识的人重新编写会大大改善它)

如何优化?

编辑:

至于回答@harold

有一个改进:

  • 1.0/sqrt(100.0) 在我的旧机器上需要 140 个周期

  • InvSqrt - c 版本 - 需要 44 个周期(尽管准确度并不惊人)

  • asm 中的 ansver 与 c 版本相同,需要 29 个周期

(测量值可能有些近似,但 IMO 总体上似乎没问题,由 rtdsc 1000x for loop 完成,然后产生 140000/1000 = 140cycles 29000/1000 = 29cycles 等等)

0 投票
1 回答
208 浏览

optimization - intersectRaySphere x86 fpu asm 例程 - 如何优化

你好,我有一些 c 程序:

我试图用 x86 fpu asm 重写它并创建这样一个

经过测试,它工作正常,c 例程大约需要 150 个周期(在我 6 或 7 岁的奔腾 4 上),我的 asm 例程大约需要 66 个周期(*) - 所以这是一个很好的改进,但也许它也可以还是有所改善?

tnx

(*)我在随机输入数据上测试时不太小心,所以可能是“非交叉”原因 - 不涉及 sqrt

0 投票
3 回答
2723 浏览

c++ - 除法为乘法和LUT?/ 快速浮点除法倒数

是否可以以查找表的形式进行浮点除法的倒数(例如 1/f -> 1*inv[f] )?怎么可能做到?我认为 some 和 mask 和 shift 应该应用于 float 以使其成为一种索引形式?究竟会怎样?