Tag: ieee 754

IEEE 754到C语言的十进制

我正在寻找将浮点数转换为C中的十进制表示的最佳方法。我将尝试给出一个示例:用户在IEEE754(1 1111111 10101 …)中引入一个数字,程序必须返回十进制表示(例如25.6) 我尝试过使用掩码和按位操作,但我没有任何逻辑结果。

用C语言解释32位无符号长单精度IEEE-754浮点数

我使用的是Microchip的XC32编译器,它基于标准的C编译器。 我正在从RS485网络上的设备读取32位值,并将其存储在unsigned long中,我将其命名为DWORD。 即 typedef DWORD unsigned long; 就目前而言,当我将此值转换为浮点值时,我得到的值基本上是它的整数表示的浮点版本,而不是正确的IEEE-754解释浮点数。 即 DWORD dword_value = readValueOnRS485(); float temp = (float)dword_value; 这里,dword_value会以hex格式表示为0x4366C0C4,作为十进制表示为1130807492,因此将其类型转换为float只会给我1.130807492 * 10 ^ 9或1130807492.0这不是我想要的。 我想要单精度IEEE-754表示,它给我一个浮点值230.75299072265625 所以显然,对浮动进行类型转换对我来说不起作用。 我需要一种可以转换此forms的方法。 我在XC32库中看了一遍,但找不到任何东西。 有没有人知道一个预定义的方法,为我正确地解释了这个? 或者可能有一些建议的方法我可以写? 我试图避免为这个特定任务编写自己的代码,因为我担心如果C已经有了这个function,我找不到有效的解决方案。 有趣的是,如果我对char *执行此操作,则该值在该char *上正确表示为230.75: sprintf(random_char_pointer, “%.2f, dword_value); 这里打印random_char_pointer到屏幕给我230.75所以sprintf必须正确处理解释。 因此我假设C中已经存在某些东西。 有人可以帮忙吗?

有关IEEE 754的问题,64位双?

请看一下以下内容: 我理解如何将双精度转换为基于IEEE 754的二进制。但我不明白该公式的用途。 当我们使用上面的公式时,有人可以给我一个例子吗? 非常感谢。

如何打印出IEEE754号码(没有printf)?

出于这个问题的目的,我没有能力使用printf工具(遗憾的是,我无法告诉你原因,但我们现在只想假设我知道我在做什么)。 对于IEEE754单精度数,您有以下位: SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF 其中S是符号, E是指数, F是分数。 打印标志对于所有情况都相对容易,因为捕获所有特殊情况,如NaN ( E == 0xff, F != 0 ), Inf ( E == 0xff, F == 0 )和0 ( E == 0, F == 0 ,被认为是特殊的,因为在这种情况下不使用指数偏差)。 我有两个问题。 第一个是如何最好地将非规范化数字(其中E == 0, F != 0 )转换为标准化数字(其中1 <= E <= 0xfe )? 我怀疑这对于简化下一个问题的答案是必要的(但我可能是错的,所以随时教育我)。 第二个问题是如何打印标准化数字。 我希望能够以两种方式打印它们,指数如-3.74195E3和非指数如3741.95 […]

IEEE Std 754浮点:让t:= a – b,标准保证a == b + t吗?

假设t , a , b都是双(IEEE Std 754)变量,并且a , b两个值都不是NaN (但可以是Inf )。 在t = a – b ,我是否必须有a == b + t ?

C IEEE-Floats inf等于inf

在C中,在使用IEEE-754浮点数的实现中,当我比较两个NaN的浮点数时,它返回0或“false”。 但是为什么两个浮点数都相等呢? 本程序打印“相等:……”(至少在Linux AMD64下使用gcc),在我看来它应该打印“不同:……”。 #include #include int main(void) { volatile double a = 1e200; //use volatile to suppress compiler warnings volatile double b = 3e200; volatile double c = 1e200; double resA = a * c; //resA and resB should by inf double resB = b * c; if (resA == resB) { printf(“equal: %e […]

IEEE 754:它究竟是如何工作的?

为什么以下代码的行为与C中的行为相同? float x = 2147483647; //2^31 printf(“%f\n”, x); //Outputs 2147483648 这是我的思考过程: 2147483647 = 0 1001 1101 1111 1111 1111 1111 1111 111 (0.11111111111111111111111)base2 = (1-(0.5)^23)base10 => (1.11111111111111111111111)base2 = (1 + 1-(0.5)^23)base10 = (1.99999988)base10 因此,要将IEEE 754表示法转换回小数: 1.99999988 * 2^30 = 2147483520 所以从技术上讲,C程序必须打印出2147483520,对吗?

IEEE – 754 – 找到signbit,exponent,frac,normalized等

我接收一个8位hex数作为IEEE 754位浮点数,我想打印有关该数字的信息(signbit,expbits,fractbits,normalized,denormalized,infinity,zero,NAN)浮点应该是单个。 我读了一下比特移位,我想这就是我想这样做的原因吗? 但是,我不是百分百肯定。 我知道符号位位于数字的最左侧位置。 表示正面或负面。 我将它移动多少才能找到每个? 我只是继续转移它找到每一个? 谁能解释我是如何找到每一个人的? 我会换1来找到标志吗? 我会换8来得到指数吗? 我会换23来获得压裂吗? signbit应为零 expbits应该是128 fracbits应该是0x00000000我认为…… 如果是这样我怎么在换class后测试呢? 这就是我到目前为止所拥有的 #include #include int main(int argc, char *argv[]) { short wordOrder = 0x0100; int HexNumber; printf(“Hex IEEE – 754\n”); if(wordOrder == 0x0100) { printf(“\nbyte order: big-endian\n”); } else { printf(“byte order: little-endian\n”); } printf(“\n>”); scanf(“%x”, &HexNumber); printf(“\n%#x”,HexNumber); return 0; […]

为什么IEEE-754浮点数不能在平台之间交换?

已经断言 (甚至考虑字节字节序)IEEE754浮点并不保证在平台之间可以交换。 所以: 理论上,为什么IEEE浮点不能在平台之间交换? 这些问题是否适用于现代硬件平台(例如i686,x64,arm)? 如果问题是有效的,你能否请举例说明这种情况(首选C或C ++)? 动机:一些GPS 制造商在“符合IEEE-754标准的浮点值”中交换(例如)纬度,经度和原始数据的二进制格式。 因此,我无法控制选择文本格式或其他“便携式”格式。 因此,我的问题是,差异可能会或可能不会发生。

Do-s和DO-for浮点运算?

对于浮点运算(IEEE754,如果存在混淆)有什么好的做法和不做什么,以确保良好的数值稳定性和结果的高精度? 我知道有些人不喜欢减去相似幅度的数量,但我很好奇其他有什么好的规则。