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 }
SpecialOperation

 

  下面使用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
PC运行结果(GNU GCC Compiler)

 

单片机运行结果(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 6)

 

单片机运行结果(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 , wi FPU , ARM compiler - default compiler Version 5)

 

单片机运行结果(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 6)

 

单片机运行结果(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
单片机运行结果(STM32G4 , wo FPU , ARM compiler - default compiler Version 5)

 

posted @ 2025-05-02 12:07  蓝bleu  阅读(68)  评论(0)    收藏  举报