Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以浮点形式输出IEEE-754格式的整数_C++_Ieee 754_Data Conversion - Fatal编程技术网

C++ 如何以浮点形式输出IEEE-754格式的整数

C++ 如何以浮点形式输出IEEE-754格式的整数,c++,ieee-754,data-conversion,C++,Ieee 754,Data Conversion,我有一个无符号长整数值,它表示使用IEEE-754格式的浮点。什么是最快的方式打印出来作为浮点在C++ + < /P> 我知道一种方法,但我想知道C++中是否有一个方便的工具会更好。 我知道的一个例子是: union { unsigned long ul; float f; } u; u.ul = 1084227584; // in HEX, this is 0x40A00000 cout << "float value is: " << u.f &l

我有一个无符号长整数值,它表示使用IEEE-754格式的浮点。什么是最快的方式打印出来作为浮点在C++ + < /P> <>我知道一种方法,但我想知道C++中是否有一个方便的工具会更好。 我知道的一个例子是:

union
{
    unsigned long ul;
    float f;
} u;

u.ul = 1084227584; // in HEX, this is 0x40A00000

cout << "float value is: " << u.f << endl;
联合
{
无符号长ul;
浮动f;
}u;
u、 ul=1084227584;//在十六进制中,这是0x40A00000

coutEDIT:我以前认为这是“令人讨厌的”,但结果比我想象的更糟——详情请参见评论。我不推荐这种方法,但我把它留在这里是为了记录这种可能性(以及警告!)


您可以使用指针:

long ul = 1084227584;
float* fp = (float*) &ul;
float f = *fp;
(这可以浓缩成一行,但我认为不这样做更清楚。)

基本上和你们的工会一样。。。而且同样狡猾,除非你确定所涉及类型的大小


如果您的平台支持它们,您可能应该为整型和浮点型使用特定于大小的类型名称。

它仅适用于32位计算机或sizeof(long)==sizeof(float)的计算机。在现代机器上,您可能希望使用int来代替。。。如果你在玩这个把戏,你真的得小心点。

我和乔恩·斯基特的想法是一样的,但他比我强。不过,我会比他做得更简洁一点

cout << "float value is: " << *((float *) &ulValue)) << endl;

cout你建议的联合方法是大多数人通常会采用的方法。然而,在C/C++中,从联合中读取不同于最近编写的成员是技术上未定义的行为。尽管如此,它在几乎所有的编译器中都得到了很好的支持

例如,强制转换指针是一个坏主意——这违反了C的规则。激进的优化编译器将为此生成不正确的代码,因为它假定
无符号long*
float*
类型的指针永远不会互为别名

就标准遵从性而言(即,不调用未定义的行为),最正确的方法是转换
char*
,因为严格的别名规则允许
char*
指针将任何其他类型的指针别名:

unsigned long ul = 0x40A00000;
float f;
char *pul = (char *)&ul;  // ok, char* can alias any type
char *pf = (char *)&f;    // ok, char* can alias any type
memcpy(pf, pul, sizeof(float));
尽管说实话,我还是会选择联合方法。从上面的cellperformance.com链接:

这是一种极为常见的习惯用法,受到所有主要编译器的良好支持。实际上,以任何顺序向工会任何成员进行阅读和写作都是可以接受的做法


斯维吉的方向正确,但错过了一个角色。正确的方法是

long l = 1084227584L
float f = reinterpret_cast<float&>(l);
长l=1084227584L
浮动f=重新解释铸件(l);

实际上,无论大小,它都取决于实现。这比工会的把戏要好,工会的把戏虽然没有定义,但仍然不是好主意。这打破了C99严格的别名规则,激进的优化编译器可能会产生不正确的结果。看,谢谢-我原以为这很不舒服,但当尺寸合适时,实际上并没有可能坏掉。编辑以使其更清晰,谢谢。如果你认为答案应该完全删除是个坏主意,请告诉我——我很乐意。我会保留它——带指针的键入双关语是一种常见的技巧,尽管它是错误的。许多编译器不遵循严格的别名规则(见鬼,在标准实施10年后,甚至没有一个完全符合C99的编译器),但这仍然值得了解。只是说得很迂腐:从这个意义上说,新的“严格别名规则”是程序员的规则,而不是编译器的规则。所有编译器都遵循这些规则,只是大多数编译器没有利用这些规则来应用所有可能的优化。但是只要假设任意两个指针,任何类型,都可能是别名,你就可以成为一个标准兼容的编译器。哇,我没意识到别名会引起问题。谢谢分享“float”不能保证表示为IEEE-754,因此使用任何形式的强制转换将带有IEEE754的字节数组转换为float仍然是未定义的。
long l = 1084227584L
float f = reinterpret_cast<float&>(l);