将 double 转换为 float 而不依赖 FPU 舍入模式
有没有人有方便的代码片段,可以将 IEEE 754 double
转换为紧邻的下级(resp.superior)float
,无需更改或假设有关 FPU 的任何内容当前舍入模式?
注意:此限制可能意味着根本不使用 FPU。我希望在这些条件下执行此操作的最简单方法是读取 64 位长的双精度数位并进行处理。
为了简单起见,您可以假设您选择的字节序,并且可以通过下面联合的 d 字段获得所讨论的双精度:
union double_bits
{
long i;
double d;
};
我会尝试自己做,但我确信我会引入硬性-注意非规范化或负数的错误。
Does anyone have handy the snippets of code to convert an IEEE 754 double
to the immediately inferior (resp. superior) float
, without changing or assuming anything about the FPU's current rounding mode?
Note: this constraint probably implies not using the FPU at all. I expect the simplest way to do it in these conditions is to read the bits of the double in a 64-bit long and to work with that.
You can assume the endianness of your choice for simplicity, and that the double in question is available through the d
field of the union below:
union double_bits
{
long i;
double d;
};
I would try to do it myself but I am certain I would introduce hard-to-notice bugs for denormalized or negative numbers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我认为以下方法可行,但我将首先陈述我的假设:
nextafterf()
可用(它在 C99 中指定) )。而且,这种方法很可能不是很有效。
在我的机器上,它打印:
这个想法是,我将 double 值转换为 float 值 - 这可能小于或大于 double 值,具体取决于舍入模式。当转换回 double 时,我们可以检查它是否小于或大于原始值。然后,如果
float
的值方向不正确,我们会沿着原始数字的方向查看转换后的数字中的下一个float
数字。I think the following works, but I will state my assumptions first:
nextafterf()
available (it's specified in C99).Also, most likely, this method is not very efficient.
On my machine, it prints:
The idea is that I am converting the
double
value to afloat
value—this could be less than or greater than the double value depending upon the rounding mode. When converted back todouble
, we can check if it is smaller or greater than the original value. Then, if the value of thefloat
is not in the right direction, we look at the nextfloat
number from the converted number in the original number's direction.要更准确地完成这项工作,而不仅仅是重新组合尾数和指数位,请查看以下内容:
http:// /www.mathworks.com/matlabcentral/fileexchange/23173
问候
To do this job more accurately than just re-combine mantissa and exponent bit's check this out:
http://www.mathworks.com/matlabcentral/fileexchange/23173
regards
我在这里发布了执行此操作的代码: https://stackoverflow.com/q/19644895/364818 并将其复制到下面您的方便。
I posted code to do this here: https://stackoverflow.com/q/19644895/364818 and copied it below for your convenience.