【发布时间】:2016-08-24 01:19:08
【问题描述】:
我们如何在 C99 中获得带符号的浮点零?其实,我想看看它的位模式。
【问题讨论】:
-
所有浮点类型都是有符号的。如果你想要负零,那就另当别论了
标签: c floating-point c99
我们如何在 C99 中获得带符号的浮点零?其实,我想看看它的位模式。
【问题讨论】:
标签: c floating-point c99
有符号浮点零,我认为你的意思是负零。如果是这样,您可以使用-0.0。
例子:
#include <stdio.h>
#include <string.h>
void test(double val)
{
unsigned char array[sizeof(double)];
memcpy(array, &val, sizeof(double));
for (int i = 0; i < sizeof(double); ++i )
{
printf("%02hhx", array[i]);
}
printf("\n");
}
int main()
{
double v1 = -0.0;
double v2 = 0.0;
test(v1);
test(v2);
};
我的设置中的输出(64 位 Linux/gcc 4.8.4):
0000000000000080
0000000000000000
C 标准不要求支持负零。我只能找到像“在表示有符号零的实现”这样的短语。
如果编译器使用 IEEE 754 表示浮点数,则要求它们支持负零。来自https://en.wikipedia.org/wiki/Signed_zero#Representations。
在 IEEE 754 二进制浮点数中,零值由有偏的指数和有效数字都表示为零。负零将符号位设置为 1。某些计算的结果可能会得到负零,例如作为负数的算术下溢的结果,或者
−1.0*0.0,或者简单地作为−0.0
【讨论】:
printf("%02x", array[i]),由于默认参数提升,您将传递int 以获取无符号格式。我最近开始使用%02hhx,因为我意识到每个有理智的人都已经把它理解为“参数是int,但它是从unsigned char提升的。例如,请参阅 Clang 在github.com/TrustInSoft/tis-interpreter/issues/46 的警告
你可以使用C语句:
float zero = 0.0f;
所有float 都已签名,这是float 数字格式的一部分
【讨论】:
int main(){
float f = 0.0f;
//observe as an array of bytes
unsigned char *c = (unsigned char *)(&f);
//for each byte in the float
for (int i = 0; i < sizeof(float); ++i){
//for each bit in the byte
for (int j = 0; j < sizeof(char) * CHAR_BIT; ++j){
//print 1 or 0 based on the bit value
((c[i] >> j) & 1) ? printf("1") : printf("0");
}
}
}
看看Float Toy。
它是可视化 IEEE 浮点格式的有用工具。
【讨论】: