将双精度值转换为二进制值
如何将双精度值转换为二进制值。将双精度值转换为二进制值
我有这样的低于125252525235558554452221545332224587265一定的价值,我想将其转换为二进制format..so我保持它在双然后试图转换为二进制(1 & 0的)..我使用C#.NET
如果你的意思是你想自己做,那么这不是一个编程问题。
如果你想让电脑做到这一点,最简单的方法是使用浮点输入例程,然后以十六进制形式显示结果。在C++:
double f = atof ("5.5555555555556E18");
unsigned char *b = (unsigned char *) &f;
for (int j = 0; j < 8; ++j)
printf (" %02x", b [j]);
您可能想要提及的是,8是针对特定数据类型的。我不认为IEEE754 64位是由C标准强制的。 – paxdiablo 2010-02-09 07:18:09
好了,你没有指定一个平台,或者什么样的你感兴趣的二进制值,但在.NET中有BitConverter.DoubleToInt64Bits
,它可以让你在IEEE 754位组成的价值非常简单地。
在Java中,有Double.doubleToLongBits
它做同样的事情。
请注意,如果您有诸如“125252525235558554452221545332224587265”之类的值,那么您获得的信息比双精度首先能准确存储的更多。
双值已经是一个二进制值。这只是您希望具有的代表性问题。在编程语言中,当你将它称为double时,那么你使用的语言将以一种方式解释它。如果你碰巧把同一块内存调用为int,那么它就不是同一个数字。
所以这取决于你真正想要的......如果你需要将它写入磁盘或网络,那么你需要考虑BigEndian/LittleEndian。
我有一些像这样下面的值125252525235558554452221545332224587265我想将其转换为二进制格式..所以我保持它在双然后尝试转换为二进制(1和0)..我使用C#.net – raj 2010-02-09 08:56:41
顺便说一句,该数字长度为127位,因此只能用双精度近似(很差)。 – 2010-02-09 13:39:57
在C语言中,你可以做到这一点,例如这种方式,这是一个典型的利用union
构建的:
int i;
union {
double x;
unsigned char byte[sizeof (double)];
} converter;
converter.x = 5.5555555555556e18;
for(i = 0; i < sizeof converter.byte; i++)
printf("%02x", converter.byte[i]);
如果你坚持这样的main()
并运行它,它可能会打印这样的事情:虽然这
~/src> gcc -o floatbits floatbits.c
~/src> ./floatbits
ba b5 f6 15 53 46 d3 43
注意,当然,是在其endianness平台相关的。以上是来自在Sempron CPU上运行的Linux系统,即它是小端。
对于这些庞大的数字(无法使用double精确呈现),您需要使用一些专门的类来保存所需的信息。
C#提供的十进制类:
十进制值类型表示十进制数范围从正到79,228,162,514,264,337,593,543,950,335负79,228,162,514,264,337,593,543,950,335。十进制值类型适用于需要大量重要整数和小数位并且没有舍入误差的财务计算。十进制类型并不排除舍入的需要。相反,它最大限度地减少了四舍五入造成的错误。例如,下面的代码产生的0.9999999999999999999999999999而不是1
如果你需要比这更大的精确度,你需要让自己的类我猜的结果。这里有一个整数:http://sourceforge.net/projects/cpp-bigint/,虽然它似乎是C++。
你需要在你的问题上更具体一些。诸如编程语言,CPU,操作系统等的细节以及更多关于实际尝试实现的内容将会产生更好的答案。 http://catb.org/~esr/faqs/smart-questions.html – 2010-02-09 08:38:46