双转换,而不依赖于FPU舍入模式浮动

有没有人有代码方便的片断转换成一个IEEE 754 double至劣立即(相应上级) float 在不改变或承担有关FPU的当前舍入模式什么

注意:这个约束可能意味着不使用FPU都没有。 我期望做它在这些条件下,最简单的方法是将读出的双重的位在64位长,并与工作。

你可以假设你选择简单的存储方式,以及双重的问题是可以通过d低于联盟的领域:

union double_bits { long i; double d; };

我会尽力做我自己,但我敢肯定我会带来难以通知的bug非规格化数或负数。

--------------解决方案-------------

我想下面的作品,但我会先说明我的假设:

  • 浮点数存储在IEEE-754格式具体的实现,
  • 无溢出,
  • 你有nextafterf()用(它在C99指定)。

另外,最有可能的,这种方法不是很有效。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
/* Change to non-zero for superior, otherwise inferior */
int superior = 0;

/* double value to convert */
double d = 0.1;

float f;
double tmp = d;

if (argc > 1)
d = strtod(argv[1], NULL);

/* First, get an approximation of the double value */
f = d;

/* Now, convert that back to double */
tmp = f;

/* Print the numbers. %a is C99 */
printf("Double: %.20f (%a)\n", d, d);
printf("Float: %.20f (%a)\n", f, f);
printf("tmp: %.20f (%a)\n", tmp, tmp);

if (superior) {
/* If we wanted superior, and got a smaller value,
get the next value */
if (tmp < d)
f = nextafterf(f, INFINITY);
} else {
if (tmp > d)
f = nextafterf(f, -INFINITY);
}
printf("converted: %.20f (%a)\n", f, f);

return 0;
}

在我的机器,它打印:

Double: 0.10000000000000000555 (0x1.999999999999ap-4)
Float: 0.10000000149011611938 (0x1.99999ap-4)
tmp: 0.10000000149011611938 (0x1.99999ap-4)
converted: 0.09999999403953552246 (0x1.999998p-4)

我们的想法是,我转换double价值,一个float值,这可能比这取决于舍入模式的双重价值小于或更高。 当转换回double ,我们可以检查它是否是比原来的值小或更大。 然后,如果该值float是不是在正确的方向,我们来看下float从原来的号码的方向转换的数字编号。

为了更准确地不仅仅是重新组合尾数和做好这项工作指数位的检查了这一点:

http://www.mathworks.com/matlabcentral/fileexchange/23173

问候

我张贴的代码来做到这一点的位置:转换IEEE双到IEEE浮点没有原生支持以下复制它为您提供方便。

// d is IEEE double, but double is not natively supported.
static float ConvertDoubleToFloat(void* d)
{
unsigned long long x;
float f; // assumed to be IEEE float
unsigned long long sign ;
unsigned long long exponent;
unsigned long long mantissa;

memcpy(&x,d,8);

// IEEE binary64 format (unsupported)
sign = (x >> 63) & 1; // 1
exponent = ((x >> 52) & 0x7FF); // 11
mantissa = (x >> 0) & 0x000FFFFFFFFFFFFFULL; // 52
exponent -= 1023;

// IEEE binary32 format (supported)
exponent += 127; // rebase
exponent &= 0xFF;
mantissa >>= (52-23); // left justify

x = mantissa | (exponent << 23) | (sign << 31);
memcpy(&f,&x,4);

return f;
}

分类:C# 时间:2012-01-01 人气:0
分享到:

相关文章

  • 32位十六进制32位浮点(IEEE 754)在MATLAB转换 2012-09-16

    我怎样才能根据IEEE 754 32位十六进制值更改为浮点值? 编辑: ... data = fread(fid,1,'float32'); disp(data); ... 我得到这样的回答: 4.2950e + 009 1.6274e + 009 ... 但是,我怎么32位浮点(IEEE 754)号码? --------------解决方案------------- 根据您的意见之一,看来你的十六进制值存储在一个文件的字符的字符串. 首先,您希望在8组根据文件的具体格式从文件读取这些字符(例如

  • 如何计算浮点数值使用IEEE 754,32位浮点内存来存储? 2012-08-07

    我有以下问题: 要计算的浮点数值使用IEEE 754,32位浮点内存来存储. 其中究竟价值之一,将你从101111100010000000000000000000001来了? 答案是: -0.15625 谁能告诉我该怎么做? --------------解决方案------------- 下面是这也解释了IEEE浮点数是如何编码的教程. http://kipirvine.com/asm/workbook/floating_tut.htm

  • IEEE 754浮点添加/舍入 2015-02-26

    我不明白我怎么能在IEEE 754浮点加(指数的主要是"重新调整") 此外四舍五入,如何卫队,圆形及粘发挥作用? 如何做到一般四舍五入(基数为2花车即是) 例如. 假设QN:添加十六进制0x383FFBAD和0x3FD0ECCD代表的IEEE 754浮点数,再到0给出答案圆形,\ $ \分​​\ infty \ $,最近 所以我有 0x383FFBAD 0 | 0111 0000 | 0111 1111 1111 0111 0101 1010 0x3FD0ECCD 0 | 0111 1

  • 如何转换2+(2/7),以IEEE 754浮点 2014-11-10

    能向我解释某人的步骤转换为十进制格式(如2+(2/7))到IEEE 754浮点表示一个数字? 谢谢! --------------解决方案------------- 首先, 2 + 2/7是不是在大多数人称之为"十进制格式". "小数格式"会更普遍被用于指示一个数,如: 2.285714285714285714285714285714285714285714... 即使是...是有点朝三暮四. 更常见的是,数字将被截断或舍入到一些数的十进制数字: 2.2857142

  • 关于IEEE 754,64位双待? 2012-01-07

    请看看下面的内容: 我知道如何双转换为基于IEEE 754二进制,但我不明白什么公式的用途. 谁能给我一个例子,当我们用上述公式,好吗? 非常感谢. --------------解决方案------------- 即以红色突出显示的公式可用于计算,当作为IEEE 754双处理过的64位值表示的实数. 如果你想手动计算从二元到它所表示的基数为10的实数,转换它的唯一有用的这种核实C库的实现的正确性时作为printf . 例如,使用上式0x3fd5555555555555 ,x被发现是恰好0.333

  • 帮助 - IEEE - 754 - 提取物,归一化,南,等 2012-06-06

    〜请原谅我 - 我有一前一后称为IEEE - 754 - 找到signbit,指数,压裂,标准化等. 不过,我也没有登记我的网卡,我不能编辑它. (所以后期基本上是死我了),有人能删除吗? 我的问题是没有答案也. 所以我张贴这种用不同的代码. 我还需要很多的帮助......所以请不要把这篇文章作为一个重复的... 我发现符号位,指数位和尾数.. 我该怎么进行测试,以找到归? 如果EXP == 0? 我怎么测试无穷大? EXP == 0xFF的和mantiassa == 0? 它的标志有什么关系呢

  • 在C#和JavaScript IEEE 754浮点运算舍入误差 2012-06-21

    我刚读一本书的JavaScript. 作者提到一个浮点运算的IEEE 754标准的舍入误差. 例如加入0.1和0.2的产量0.30000000000000004代替0.3. 所以(0.1 + 0.2) == 0.3返回false. 我也转载在c#这个错误. 因此,这些都是我的问题是: 如何经常发生这个错误? 什么是C#和JavaScript的最佳实践的解决方法? 其中其他语言有同样的错误? --------------解决方案------------- 这不是在语言错误. 这不是在IEEE 75

  • 在IEEE 754规格(二进制浮点运算)十进制转换范围 2012-08-10

    表2中的IEEE 754规范第11页的底部5.6列举了十进制到二进制浮点转换必须进行十进制值的范围. 指数的范围没有任何意义了我. 例如,对于双精度,该表表示的最大十进制值资格被转化为(10 17 -1)* 10 999. 这是这样更大然后DBL_MAX,这大约是1.8 * 10 308. 很显然,我失去了一些东西 - 有人可以解释这个表给我吗? 谢谢. --------------解决方案------------- [附注:从技术上说,你链接到该文档不再是标准的; "IEEE 754"

  • 编码和解码的IEEE 754浮点数在JavaScript 2012-08-26

    我需要进行编码和解码的IEEE 754浮点型和双二进制中的node.js来分析网络协议. 是否有这样做,还是我读了规范,并实现它自己的任何现有的库? 或者我应该写一个C模块办呢? --------------解决方案------------- 注意,作为节点0.6的此功能包含在核心库,所以这是做到这一点的新最佳方式. 见http://nodejs.org/docs/latest/api/buffer.html了解详细信息. 如果你正在读/写,你可以考虑使用一个友好的包装解决此功能,以使事情更容易

  • 什么语言获得IEEE 754吧? 2012-08-30

    我只花我一周的主题搞乱,并没有发现该得到IEEE 754规格正确的语言. 即使GCC不尊重有关C99的部分(它忽略FENV_ACCESS杂了,我一直在说,比我工作的例子是侥幸). 这是不可能的(据我所知)尊重与库函数的规格,你需要从语言的支持,因为当你用标志或四舍五入玩一些常见的优化是被禁止的. 有语言有(APPART从C / C ++或原始组装),让我获得舍入模式,异常标志和微积分:因此,这里是我的真正的问题? --------------解决方案------------- 既然你是在谈论IE

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.313 (s). 10 q(s)