float格式与特殊操作
我们目前float的类型,其实是IEEE Std 754™-2019中规定的Binary interchange floating-point format。//此协议还规定了另一种格式,Decimal interchange floating-point formats
下面所有内容均基于Binary interchange format
| 1 bit | 8 bit | 23 bit | | S | E | T | | Sign | bias Exponent | Trailing significand field |
//规范文档用的T表示的有效位,但各种资料都用M(antissa)来表示,没去找源头
1.E = 0时,数值为 (-1)S * 2-126 * (T / 223)
2.E = 0xFF 且 T = 0时,S = 0代表 +inf,S = 1代表 -inf//infinity
3.E = 0xFF 且 T ≠ 0时,代表NaN//not a number、
4.E ≠ 0 且 E ≠ 0xFF时,数值为 (-1)S * 2E -127 * ((T / 223) + 1)
特殊操作:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdint.h> 4 #define S_OFFSET 31 5 #define E_OFFSET 23 6 #define T_OFFSET 0 7 float PZero; 8 float NZero; 9 float PNaN; 10 float NNaN; 11 float PInfinity; 12 float NInfinity; 13 void test(void) 14 { 15 float tmpFloat; 16 uint32_t tmpBitData; 17 tmpBitData = (0U << S_OFFSET) | (0U << E_OFFSET) | (0U << T_OFFSET); 18 PZero = *(float*)&tmpBitData; 19 printf("PZero = %f\n",PZero); 20 tmpBitData = (1U << S_OFFSET) | (0U << E_OFFSET) | (0U << T_OFFSET); 21 NZero = *(float*)&tmpBitData; 22 printf("NZero = %f\n",NZero); 23 tmpBitData = (0U << S_OFFSET) | (0xFFU << E_OFFSET) | (0x400000U << T_OFFSET); 24 PNaN = *(float*)&tmpBitData; 25 printf("PNaN = %f\n",PNaN); 26 tmpBitData = (1U << S_OFFSET) | (0xFFU << E_OFFSET) | (0x400000U << T_OFFSET); 27 NNaN = *(float*)&tmpBitData; 28 printf("NNaN = %f\n",NNaN); 29 tmpBitData = (0U << S_OFFSET) | (0xFFU << E_OFFSET) | (0U << T_OFFSET); 30 PInfinity = *(float*)&tmpBitData; 31 printf("PInfinity = %f\n",PInfinity); 32 tmpBitData = (1U << S_OFFSET) | (0xFFU << E_OFFSET) | (0U << T_OFFSET); 33 NInfinity = *(float*)&tmpBitData; 34 printf("NInfinity = %f\n",NInfinity); 35 printf("\n"); 36 printf("+ABS(n) + PInfinity = %f\n",+1.0 + PInfinity); 37 printf("+ABS(n) + NInfinity = %f\n",+1.0 + NInfinity); 38 printf("-ABS(n) + PInfinity = %f\n",-1.0 + PInfinity); 39 printf("-ABS(n) + NInfinity = %f\n",-1.0 + NInfinity); 40 printf("\n"); 41 printf("+ABS(n) - PInfinity = %f\n",+1.0 - PInfinity); 42 printf("+ABS(n) - NInfinity = %f\n",+1.0 - NInfinity); 43 printf("-ABS(n) - PInfinity = %f\n",-1.0 - PInfinity); 44 printf("-ABS(n) - NInfinity = %f\n",-1.0 - NInfinity); 45 printf("\n"); 46 printf("+ABS(n) * PInfinity = %f\n",+1.0 * PInfinity); 47 printf("+ABS(n) * NInfinity = %f\n",+1.0 * NInfinity); 48 printf("-ABS(n) * PInfinity = %f\n",-1.0 * PInfinity); 49 printf("-ABS(n) * NInfinity = %f\n",-1.0 * NInfinity); 50 printf("\n"); 51 printf("+ABS(n) / PInfinity = %f\n",+1.0 / PInfinity); 52 printf("+ABS(n) / NInfinity = %f\n",+1.0 / NInfinity); 53 printf("-ABS(n) / PInfinity = %f\n",-1.0 / PInfinity); 54 printf("-ABS(n) / NInfinity = %f\n",-1.0 / NInfinity); 55 printf("\n"); 56 tmpFloat = PInfinity + PInfinity; 57 printf("PInfinity + PInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 58 tmpFloat = PInfinity + NInfinity; 59 printf("PInfinity + NInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 60 tmpFloat = NInfinity + PInfinity; 61 printf("NInfinity + PInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 62 tmpFloat = NInfinity + NInfinity; 63 printf("NInfinity + NInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 64 printf("\n"); 65 tmpFloat = PInfinity - PInfinity; 66 printf("PInfinity - PInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 67 tmpFloat = PInfinity - NInfinity; 68 printf("PInfinity - NInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 69 tmpFloat = NInfinity - PInfinity; 70 printf("NInfinity - PInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 71 tmpFloat = NInfinity - NInfinity; 72 printf("NInfinity - NInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 73 printf("\n"); 74 printf("PInfinity * PInfinity = %f\n",PInfinity * PInfinity); 75 printf("PInfinity * NInfinity = %f\n",PInfinity * NInfinity); 76 printf("NInfinity * PInfinity = %f\n",NInfinity * PInfinity); 77 printf("NInfinity * NInfinity = %f\n",NInfinity * NInfinity); 78 printf("\n"); 79 tmpFloat = PInfinity / PInfinity; 80 printf("PInfinity / PInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 81 tmpFloat = PInfinity / NInfinity; 82 printf("PInfinity / NInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 83 tmpFloat = NInfinity / PInfinity; 84 printf("NInfinity / PInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 85 tmpFloat = NInfinity / NInfinity; 86 printf("NInfinity / NInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 87 printf("\n"); 88 printf("PInfinity / PZero = %f\n",PInfinity / PZero); 89 printf("PInfinity / NZero = %f\n",PInfinity / NZero); 90 printf("NInfinity / PZero = %f\n",NInfinity / PZero); 91 printf("NInfinity / NZero = %f\n",NInfinity / NZero); 92 printf("\n"); 93 printf("+ABS(nonZero) / PZero = %f\n",+1.0 / PZero); 94 printf("+ABS(nonZero) / NZero = %f\n",+1.0 / NZero); 95 printf("-ABS(nonZero) / PZero = %f\n",-1.0 / PZero); 96 printf("-ABS(nonZero) / NZero = %f\n",-1.0 / NZero); 97 printf("\n"); 98 tmpFloat = PZero / PZero; 99 printf("PZero / PZero = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 100 tmpFloat = PZero / NZero; 101 printf("PZero / NZero = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 102 tmpFloat = NZero / PZero; 103 printf("NZero / PZero = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 104 tmpFloat = NZero / NZero; 105 printf("NZero / NZero = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 106 printf("\n"); 107 printf("+ABS(nonZero) * PInfinity = %f\n",+1.0 * PInfinity); 108 printf("+ABS(nonZero) * NInfinity = %f\n",+1.0 * NInfinity); 109 printf("-ABS(nonZero) * PInfinity = %f\n",-1.0 * PInfinity); 110 printf("-ABS(nonZero) * NInfinity = %f\n",-1.0 * NInfinity); 111 printf("\n"); 112 tmpFloat = PZero * PInfinity; 113 printf("PZero * PInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 114 tmpFloat = PZero * NInfinity; 115 printf("PZero * NInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 116 tmpFloat = NZero * PInfinity; 117 printf("NZero * PInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 118 tmpFloat = NZero * NInfinity; 119 printf("NZero * NInfinity = %f (0x%08x)\n",tmpFloat,*(uint32_t*)&tmpFloat); 120 printf("\n"); 121 printf("(PZero == PZero) = %d\n",PZero == PZero); 122 printf("(NZero == NZero) = %d\n",NZero == NZero); 123 printf("(PNaN == PNaN) = %d\n",PNaN == PNaN); 124 printf("(NNaN == NNaN) = %d\n",NNaN == NNaN); 125 printf("(PInfinity == PInfinity) = %d\n",PInfinity == PInfinity); 126 printf("(NInfinity == NInfinity) = %d\n",NInfinity == NInfinity); 127 }
下面使用PC,单片机(compiler v5/v6,wi/woFPU)共5种情况对mcu进行float特殊操作的测试,先上结论:
| 设备 | FPU | 编译器 | 是否符合预期 |
| PC | / | GNU GCC Compiler | 是 |
| MCU | wi | ARM compiler - default compiler Version 6 | 否 |
| MCU | wi | ARM compiler - default compiler Version 5 | 是 |
| MCU | wo | ARM compiler - default compiler Version 6 | 否 |
| MCU | wo | ARM compiler - default compiler Version 5 | 是 |
显然,在单片机上基于armcc的v5编译器对float的特殊操作都是满足预期的,但是基于armclang的v6编译器在某些特殊操作时,是不符合规范要求的。此外,在生成NaN时,也会因为编译器差异而存在符号差异。具体实验数据如下:
PC运行结果(GNU GCC Compiler)
1 PZero = 0.000000 2 NZero = -0.000000 3 PNaN = 1.#QNAN0 4 NNaN = -1.#IND00 5 PInfinity = 1.#INF00 6 NInfinity = -1.#INF00 7 +ABS(n) + PInfinity = 1.#INF00 8 +ABS(n) + NInfinity = -1.#INF00 9 -ABS(n) + PInfinity = 1.#INF00 10 -ABS(n) + NInfinity = -1.#INF00 11 +ABS(n) - PInfinity = -1.#INF00 12 +ABS(n) - NInfinity = 1.#INF00 13 -ABS(n) - PInfinity = -1.#INF00 14 -ABS(n) - NInfinity = 1.#INF00 15 +ABS(n) * PInfinity = 1.#INF00 16 +ABS(n) * NInfinity = -1.#INF00 17 -ABS(n) * PInfinity = -1.#INF00 18 -ABS(n) * NInfinity = 1.#INF00 19 +ABS(n) / PInfinity = 0.000000 20 +ABS(n) / NInfinity = -0.000000 21 -ABS(n) / PInfinity = -0.000000 22 -ABS(n) / NInfinity = 0.000000 23 PInfinity + PInfinity = 1.#INF00 (0x7f800000) 24 PInfinity + NInfinity = -1.#IND00 (0xffc00000) 25 NInfinity + PInfinity = -1.#IND00 (0xffc00000) 26 NInfinity + NInfinity = -1.#INF00 (0xff800000) 27 PInfinity - PInfinity = -1.#IND00 (0xffc00000) 28 PInfinity - NInfinity = 1.#INF00 (0x7f800000) 29 NInfinity - PInfinity = -1.#INF00 (0xff800000) 30 NInfinity - NInfinity = -1.#IND00 (0xffc00000) 31 PInfinity * PInfinity = 1.#INF00 32 PInfinity * NInfinity = -1.#INF00 33 NInfinity * PInfinity = -1.#INF00 34 NInfinity * NInfinity = 1.#INF00 35 PInfinity / PInfinity = -1.#IND00 (0xffc00000) 36 PInfinity / NInfinity = -1.#IND00 (0xffc00000) 37 NInfinity / PInfinity = -1.#IND00 (0xffc00000) 38 NInfinity / NInfinity = -1.#IND00 (0xffc00000) 39 PInfinity / PZero = 1.#INF00 40 PInfinity / NZero = -1.#INF00 41 NInfinity / PZero = -1.#INF00 42 NInfinity / NZero = 1.#INF00 43 +ABS(nonZero) / PZero = 1.#INF00 44 +ABS(nonZero) / NZero = -1.#INF00 45 -ABS(nonZero) / PZero = -1.#INF00 46 -ABS(nonZero) / NZero = 1.#INF00 47 PZero / PZero = -1.#IND00 (0xffc00000) 48 PZero / NZero = -1.#IND00 (0xffc00000) 49 NZero / PZero = -1.#IND00 (0xffc00000) 50 NZero / NZero = -1.#IND00 (0xffc00000) 51 +ABS(nonZero) * PInfinity = 1.#INF00 52 +ABS(nonZero) * NInfinity = -1.#INF00 53 -ABS(nonZero) * PInfinity = -1.#INF00 54 -ABS(nonZero) * NInfinity = 1.#INF00 55 PZero * PInfinity = -1.#IND00 (0xffc00000) 56 PZero * NInfinity = -1.#IND00 (0xffc00000) 57 NZero * PInfinity = -1.#IND00 (0xffc00000) 58 NZero * NInfinity = -1.#IND00 (0xffc00000) 59 (PZero == PZero) = 1 60 (NZero == NZero) = 1 61 (PNaN == PNaN) = 0 62 (NNaN == NNaN) = 0 63 (PInfinity == PInfinity) = 1 64 (NInfinity == NInfinity) = 1
单片机运行结果(STM32G4 , wi FPU , ARM compiler - default compiler Version 6)
1 00> PZero = 0.000000 2 00> NZero = -0.000000 3 00> PNaN = nan 4 00> NNaN = -nan 5 00> PInfinity = inf 6 00> NInfinity = -inf 7 00> 8 00> +ABS(n) + PInfinity = inf 9 00> +ABS(n) + NInfinity = -inf 10 00> -ABS(n) + PInfinity = inf 11 00> -ABS(n) + NInfinity = -inf 12 00> 13 00> +ABS(n) - PInfinity = -inf 14 00> +ABS(n) - NInfinity = inf 15 00> -ABS(n) - PInfinity = -inf 16 00> -ABS(n) - NInfinity = inf 17 00> 18 00> +ABS(n) * PInfinity = inf 19 00> +ABS(n) * NInfinity = -inf 20 00> -ABS(n) * PInfinity = -inf 21 00> -ABS(n) * NInfinity = inf 22 00> 23 00> +ABS(n) / PInfinity = 0.000000 24 00> +ABS(n) / NInfinity = -0.000000 25 00> -ABS(n) / PInfinity = -0.000000 26 00> -ABS(n) / NInfinity = 0.000000 27 00> 28 00> PInfinity + PInfinity = inf (0x7f800000) 29 00> PInfinity + NInfinity = nan (0x7fc00000) 30 00> NInfinity + PInfinity = nan (0x7fc00000) 31 00> NInfinity + NInfinity = -inf (0xff800000) 32 00> 33 00> PInfinity - PInfinity = 0.000000 (0x00000000) 34 00> PInfinity - NInfinity = inf (0x7f800000) 35 00> NInfinity - PInfinity = -inf (0xff800000) 36 00> NInfinity - NInfinity = 0.000000 (0x00000000) 37 00> 38 00> PInfinity * PInfinity = inf 39 00> PInfinity * NInfinity = -inf 40 00> NInfinity * PInfinity = -inf 41 00> NInfinity * NInfinity = inf 42 00> 43 00> PInfinity / PInfinity = 1.000000 (0x3f800000) 44 00> PInfinity / NInfinity = nan (0x7fc00000) 45 00> NInfinity / PInfinity = nan (0x7fc00000) 46 00> NInfinity / NInfinity = 1.000000 (0x3f800000) 47 00> 48 00> PInfinity / PZero = inf 49 00> PInfinity / NZero = -inf 50 00> NInfinity / PZero = -inf 51 00> NInfinity / NZero = inf 52 00> 53 00> +ABS(nonZero) / PZero = inf 54 00> +ABS(nonZero) / NZero = -inf 55 00> -ABS(nonZero) / PZero = -inf 56 00> -ABS(nonZero) / NZero = inf 57 00> 58 00> PZero / PZero = 1.000000 (0x3f800000) 59 00> PZero / NZero = nan (0x7fc00000) 60 00> NZero / PZero = nan (0x7fc00000) 61 00> NZero / NZero = 1.000000 (0x3f800000) 62 00> 63 00> +ABS(nonZero) * PInfinity = inf 64 00> +ABS(nonZero) * NInfinity = -inf 65 00> -ABS(nonZero) * PInfinity = -inf 66 00> -ABS(nonZero) * NInfinity = inf 67 00> 68 00> PZero * PInfinity = nan (0x7fc00000) 69 00> PZero * NInfinity = nan (0x7fc00000) 70 00> NZero * PInfinity = nan (0x7fc00000) 71 00> NZero * NInfinity = nan (0x7fc00000) 72 00> 73 00> (PZero == PZero) = 1 74 00> (NZero == NZero) = 1 75 00> (PNaN == PNaN) = 1 76 00> (NNaN == NNaN) = 1 77 00> (PInfinity == PInfinity) = 1 78 00> (NInfinity == NInfinity) = 1
单片机运行结果(STM32G4 , wi FPU , ARM compiler - default compiler Version 5)
1 00> PZero = 0.000000 2 00> NZero = -0.000000 3 00> PNaN = nan 4 00> NNaN = nan 5 00> PInfinity = inf 6 00> NInfinity = -inf 7 00> 8 00> +ABS(n) + PInfinity = inf 9 00> +ABS(n) + NInfinity = -inf 10 00> -ABS(n) + PInfinity = inf 11 00> -ABS(n) + NInfinity = -inf 12 00> 13 00> +ABS(n) - PInfinity = -inf 14 00> +ABS(n) - NInfinity = inf 15 00> -ABS(n) - PInfinity = -inf 16 00> -ABS(n) - NInfinity = inf 17 00> 18 00> +ABS(n) * PInfinity = inf 19 00> +ABS(n) * NInfinity = -inf 20 00> -ABS(n) * PInfinity = -inf 21 00> -ABS(n) * NInfinity = inf 22 00> 23 00> +ABS(n) / PInfinity = 0.000000 24 00> +ABS(n) / NInfinity = -0.000000 25 00> -ABS(n) / PInfinity = -0.000000 26 00> -ABS(n) / NInfinity = 0.000000 27 00> 28 00> PInfinity + PInfinity = inf (0x7f800000) 29 00> PInfinity + NInfinity = nan (0x7fc00000) 30 00> NInfinity + PInfinity = nan (0x7fc00000) 31 00> NInfinity + NInfinity = -inf (0xff800000) 32 00> 33 00> PInfinity - PInfinity = nan (0x7fc00000) 34 00> PInfinity - NInfinity = inf (0x7f800000) 35 00> NInfinity - PInfinity = -inf (0xff800000) 36 00> NInfinity - NInfinity = nan (0x7fc00000) 37 00> 38 00> PInfinity * PInfinity = inf 39 00> PInfinity * NInfinity = -inf 40 00> NInfinity * PInfinity = -inf 41 00> NInfinity * NInfinity = inf 42 00> 43 00> PInfinity / PInfinity = nan (0x7fc00000) 44 00> PInfinity / NInfinity = nan (0x7fc00000) 45 00> NInfinity / PInfinity = nan (0x7fc00000) 46 00> NInfinity / NInfinity = nan (0x7fc00000) 47 00> 48 00> PInfinity / PZero = inf 49 00> PInfinity / NZero = -inf 50 00> NInfinity / PZero = -inf 51 00> NInfinity / NZero = inf 52 00> 53 00> +ABS(nonZero) / PZero = inf 54 00> +ABS(nonZero) / NZero = -inf 55 00> -ABS(nonZero) / PZero = -inf 56 00> -ABS(nonZero) / NZero = inf 57 00> 58 00> PZero / PZero = nan (0x7fc00000) 59 00> PZero / NZero = nan (0x7fc00000) 60 00> NZero / PZero = nan (0x7fc00000) 61 00> NZero / NZero = nan (0x7fc00000) 62 00> 63 00> +ABS(nonZero) * PInfinity = inf 64 00> +ABS(nonZero) * NInfinity = -inf 65 00> -ABS(nonZero) * PInfinity = -inf 66 00> -ABS(nonZero) * NInfinity = inf 67 00> 68 00> PZero * PInfinity = nan (0x7fc00000) 69 00> PZero * NInfinity = nan (0x7fc00000) 70 00> NZero * PInfinity = nan (0x7fc00000) 71 00> NZero * NInfinity = nan (0x7fc00000) 72 00> 73 00> (PZero == PZero) = 1 74 00> (NZero == NZero) = 1 75 00> (PNaN == PNaN) = 0 76 00> (NNaN == NNaN) = 0 77 00> (PInfinity == PInfinity) = 1 78 00> (NInfinity == NInfinity) = 1
单片机运行结果(STM32G4 , wo FPU , ARM compiler - default compiler Version 6)
1 00> PZero = 0.000000 2 00> NZero = -0.000000 3 00> PNaN = nan 4 00> NNaN = -nan 5 00> PInfinity = inf 6 00> NInfinity = -inf 7 00> 8 00> +ABS(n) + PInfinity = inf 9 00> +ABS(n) + NInfinity = -inf 10 00> -ABS(n) + PInfinity = inf 11 00> -ABS(n) + NInfinity = -inf 12 00> 13 00> +ABS(n) - PInfinity = -inf 14 00> +ABS(n) - NInfinity = inf 15 00> -ABS(n) - PInfinity = -inf 16 00> -ABS(n) - NInfinity = inf 17 00> 18 00> +ABS(n) * PInfinity = inf 19 00> +ABS(n) * NInfinity = -inf 20 00> -ABS(n) * PInfinity = -inf 21 00> -ABS(n) * NInfinity = inf 22 00> 23 00> +ABS(n) / PInfinity = 0.000000 24 00> +ABS(n) / NInfinity = -0.000000 25 00> -ABS(n) / PInfinity = -0.000000 26 00> -ABS(n) / NInfinity = 0.000000 27 00> 28 00> PInfinity + PInfinity = inf (0x7f800000) 29 00> PInfinity + NInfinity = nan (0x7fc00000) 30 00> NInfinity + PInfinity = nan (0x7fc00000) 31 00> NInfinity + NInfinity = -inf (0xff800000) 32 00> 33 00> PInfinity - PInfinity = 0.000000 (0x00000000) 34 00> PInfinity - NInfinity = inf (0x7f800000) 35 00> NInfinity - PInfinity = -inf (0xff800000) 36 00> NInfinity - NInfinity = 0.000000 (0x00000000) 37 00> 38 00> PInfinity * PInfinity = inf 39 00> PInfinity * NInfinity = -inf 40 00> NInfinity * PInfinity = -inf 41 00> NInfinity * NInfinity = inf 42 00> 43 00> PInfinity / PInfinity = 1.000000 (0x3f800000) 44 00> PInfinity / NInfinity = nan (0x7fc00000) 45 00> NInfinity / PInfinity = nan (0x7fc00000) 46 00> NInfinity / NInfinity = 1.000000 (0x3f800000) 47 00> 48 00> PInfinity / PZero = inf 49 00> PInfinity / NZero = -inf 50 00> NInfinity / PZero = -inf 51 00> NInfinity / NZero = inf 52 00> 53 00> +ABS(nonZero) / PZero = inf 54 00> +ABS(nonZero) / NZero = -inf 55 00> -ABS(nonZero) / PZero = -inf 56 00> -ABS(nonZero) / NZero = inf 57 00> 58 00> PZero / PZero = 1.000000 (0x3f800000) 59 00> PZero / NZero = nan (0x7fc00000) 60 00> NZero / PZero = nan (0x7fc00000) 61 00> NZero / NZero = 1.000000 (0x3f800000) 62 00> 63 00> +ABS(nonZero) * PInfinity = inf 64 00> +ABS(nonZero) * NInfinity = -inf 65 00> -ABS(nonZero) * PInfinity = -inf 66 00> -ABS(nonZero) * NInfinity = inf 67 00> 68 00> PZero * PInfinity = nan (0x7fc00000) 69 00> PZero * NInfinity = nan (0x7fc00000) 70 00> NZero * PInfinity = nan (0x7fc00000) 71 00> NZero * NInfinity = nan (0x7fc00000) 72 00> 73 00> (PZero == PZero) = 1 74 00> (NZero == NZero) = 1 75 00> (PNaN == PNaN) = 1 76 00> (NNaN == NNaN) = 1 77 00> (PInfinity == PInfinity) = 1 78 00> (NInfinity == NInfinity) = 1
单片机运行结果(STM32G4 , wo FPU , ARM compiler - default compiler Version 5)
1 00> PZero = 0.000000 2 00> NZero = -0.000000 3 00> PNaN = nan 4 00> NNaN = nan 5 00> PInfinity = inf 6 00> NInfinity = -inf 7 00> 8 00> +ABS(n) + PInfinity = inf 9 00> +ABS(n) + NInfinity = -inf 10 00> -ABS(n) + PInfinity = inf 11 00> -ABS(n) + NInfinity = -inf 12 00> 13 00> +ABS(n) - PInfinity = -inf 14 00> +ABS(n) - NInfinity = inf 15 00> -ABS(n) - PInfinity = -inf 16 00> -ABS(n) - NInfinity = inf 17 00> 18 00> +ABS(n) * PInfinity = inf 19 00> +ABS(n) * NInfinity = -inf 20 00> -ABS(n) * PInfinity = -inf 21 00> -ABS(n) * NInfinity = inf 22 00> 23 00> +ABS(n) / PInfinity = 0.000000 24 00> +ABS(n) / NInfinity = -0.000000 25 00> -ABS(n) / PInfinity = -0.000000 26 00> -ABS(n) / NInfinity = 0.000000 27 00> 28 00> PInfinity + PInfinity = inf (0x7f800000) 29 00> PInfinity + NInfinity = nan (0x7fc00000) 30 00> NInfinity + PInfinity = nan (0x7fc00000) 31 00> NInfinity + NInfinity = -inf (0xff800000) 32 00> 33 00> PInfinity - PInfinity = nan (0x7fc00000) 34 00> PInfinity - NInfinity = inf (0x7f800000) 35 00> NInfinity - PInfinity = -inf (0xff800000) 36 00> NInfinity - NInfinity = nan (0x7fc00000) 37 00> 38 00> PInfinity * PInfinity = inf 39 00> PInfinity * NInfinity = -inf 40 00> NInfinity * PInfinity = -inf 41 00> NInfinity * NInfinity = inf 42 00> 43 00> PInfinity / PInfinity = nan (0x7fc00000) 44 00> PInfinity / NInfinity = nan (0x7fc00000) 45 00> NInfinity / PInfinity = nan (0x7fc00000) 46 00> NInfinity / NInfinity = nan (0x7fc00000) 47 00> 48 00> PInfinity / PZero = inf 49 00> PInfinity / NZero = -inf 50 00> NInfinity / PZero = -inf 51 00> NInfinity / NZero = inf 52 00> 53 00> +ABS(nonZero) / PZero = inf 54 00> +ABS(nonZero) / NZero = -inf 55 00> -ABS(nonZero) / PZero = -inf 56 00> -ABS(nonZero) / NZero = inf 57 00> 58 00> PZero / PZero = nan (0x7fc00000) 59 00> PZero / NZero = nan (0x7fc00000) 60 00> NZero / PZero = nan (0x7fc00000) 61 00> NZero / NZero = nan (0x7fc00000) 62 00> 63 00> +ABS(nonZero) * PInfinity = inf 64 00> +ABS(nonZero) * NInfinity = -inf 65 00> -ABS(nonZero) * PInfinity = -inf 66 00> -ABS(nonZero) * NInfinity = inf 67 00> 68 00> PZero * PInfinity = nan (0x7fc00000) 69 00> PZero * NInfinity = nan (0x7fc00000) 70 00> NZero * PInfinity = nan (0x7fc00000) 71 00> NZero * NInfinity = nan (0x7fc00000) 72 00> 73 00> (PZero == PZero) = 1 74 00> (NZero == NZero) = 1 75 00> (PNaN == PNaN) = 0 76 00> (NNaN == NNaN) = 0 77 00> (PInfinity == PInfinity) = 1 78 00> (NInfinity == NInfinity) = 1
浙公网安备 33010602011771号