quadmath 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,738 @@
1
+ #include <quadmath.h>
2
+ #include <stdio.h>
3
+ #include <stdlib.h>
4
+ #include <string.h>
5
+ #include <ctype.h>
6
+ #define BUF_SIZE 0x2000
7
+ #define RADIX10_OFFSET 1
8
+ #define RADIX2_OFFSET 2
9
+ #define FRAC_DIG (1.0e-5)
10
+
11
+ static inline int
12
+ index_of_point(char *str)
13
+ {
14
+ for (volatile int i = 0; i < (int)strlen(str); i++)
15
+ {
16
+ if (str[i] == '.') return i;
17
+ }
18
+ return -1;
19
+ }
20
+
21
+ static inline __float128
22
+ foo(__float128 x)
23
+ {
24
+ return x;
25
+ }
26
+
27
+ /**
28
+ * ool_quad2str()
29
+ * オブジェクト指向言語仕様として,__float128型をC文字列に変換する.
30
+ * @x ... 変換元の__float128型.
31
+ * @format ... 変換する書式.
32
+ * 'a' 'A' .. 十六進表記. 例: 0x1p+0 #=> 1.0
33
+ * 'b' 'B' .. 二進法の指数表記 (0~1) 例: 0.1e+1 #=> 1.0
34
+ * 'e' 'E' .. 十進法の指数表記 (1~10) 例: 1.0e+0 #=> 1.0
35
+ * 'f' 'F' .. 浮動小数点表記 例: 1.0 #=> 1.0
36
+ * 'g' 'G' .. ジェネリック.FLT128_DIGに応じて値を見やすくする.
37
+ * @exp ... 値の指数値.二進法の場合は正では1加算,負では1減算される.
38
+ * @sign ... xの符号値.非数の場合0,正の実数では1,負の実数では-1.
39
+ * @buf ... 変換された文字列.静的クラスを与えた内部変数sへのポインタを渡す.
40
+ * @@retval ... 結果を書式formatで返す.
41
+ * '0' .. 失敗.
42
+ * '1' .. 有限でない値であった場合に返す.無限大か非数のどちらかだが,signが-1は負の無限大,0は非数,1は正の無限大でスイッチできる.
43
+ * 'a' .. 十六進表記 例: 1.0 #=> 0x1p+0
44
+ * 'b' .. 二進法の指数表記 (0~1) 例: 1.0 #=> 0.1e+1
45
+ * 'e' .. 十進法の指数表記 (1~10) 例: 1.0 #=> 1.0e+0
46
+ * 'f' .. 浮動小数点表記 例: 1.0 #=> 1.0
47
+ */
48
+ char
49
+ ool_quad2str(__float128 x, char format, int *exp, int *sign, char **buf)
50
+ {
51
+ static char s[BUF_SIZE];
52
+ static char near_one[BUF_SIZE];
53
+ int expv = 0, signv = 0, offset = RADIX10_OFFSET;
54
+ int pos = -1;
55
+ char retval = '0';
56
+
57
+ if (near_one[0] == '\0')
58
+ {
59
+ near_one[0] = '0'; near_one[1] = '.';
60
+ for (long i = 0; i < FLT128_DIG; i++)
61
+ {
62
+ near_one[i+2] = '9';
63
+ }
64
+ near_one[FLT128_DIG+2] = '\0';
65
+ }
66
+
67
+ switch (format) {
68
+ case 'a': case 'A':
69
+ retval = 'a';
70
+ break;
71
+ case 'b': case 'B':
72
+ retval = 'b'; offset = RADIX2_OFFSET;
73
+ break;
74
+ case 'e': case 'E':
75
+ retval = 'e';
76
+ break;
77
+ case 'f': case 'F':
78
+ retval = 'f';
79
+ break;
80
+ case 'g': case 'G':
81
+ retval = 'g';
82
+ break;
83
+ default:
84
+ goto end;
85
+ break;
86
+ }
87
+ if (isnanq(x))
88
+ {
89
+ signv = 0;
90
+ expv = 0;
91
+ s[0] = 'N'; s[1] = 'a'; s[2] = 'N'; s[3] = 0;
92
+ *buf = s;
93
+ retval = '1';
94
+ }
95
+ else
96
+ {
97
+ __float128 absx = fabsq(x);
98
+
99
+ if (signbitq(x)) signv = -1;
100
+ else signv = 1;
101
+
102
+ if (isinfq(x))
103
+ {
104
+ expv = 0;
105
+ s[0] = 'I'; s[1] = 'n'; s[2] = 'f';
106
+ s[3] = 'i'; s[4] = 'n'; s[5] = 'i';
107
+ s[6] = 't'; s[7] = 'y'; s[8] = '\0';
108
+ *buf = s;
109
+ retval = '1';
110
+ }
111
+ else if (retval == 'a')
112
+ {
113
+ int size = quadmath_snprintf(s, BUF_SIZE, "%Qa", absx);
114
+ int is_exp_part = 0;
115
+ int exp_sign = 0;
116
+ for (int i = 0; i < size; i++)
117
+ {
118
+ if (is_exp_part)
119
+ {
120
+ switch (s[i]) {
121
+ case '+':
122
+ exp_sign = 1;
123
+ break;
124
+ case '-':
125
+ exp_sign = -1;
126
+ break;
127
+ case '0': case '1': case '2': case '3': case '4':
128
+ case '5': case '6': case '7': case '8': case '9':
129
+ if (expv == 0) expv = s[i] - '0';
130
+ else expv = expv * 10 + (s[i] - '0');
131
+ break;
132
+ default:
133
+ break;
134
+ }
135
+ }
136
+ if (s[i] == 'p' && !is_exp_part)
137
+ {
138
+ s[i] = '\0';
139
+ is_exp_part = 1;
140
+ }
141
+ }
142
+ expv *= exp_sign;
143
+ *buf = s;
144
+ }
145
+ else if (absx == 0)
146
+ {
147
+ if (retval == 'g') retval = 'f';
148
+ expv = 0;
149
+ s[0] = '0'; s[1] = '.'; s[2] = '0'; s[3] = '\0';
150
+ *buf = s;
151
+ }
152
+ else if (absx >= 10)
153
+ {
154
+ quadmath_snprintf(s+offset, BUF_SIZE-offset, "%*.*Qf", FLT128_DIG, FLT128_DIG, absx);
155
+ pos = index_of_point(s+offset);
156
+ expv = (int)pos - 1;
157
+ switch (retval) {
158
+ case 'b':
159
+ expv += 1;
160
+ break;
161
+ case 'g':
162
+ retval = ((expv + 1) > FLT128_DIG) ? 'e' : 'f';
163
+ break;
164
+ default:
165
+ break;
166
+ }
167
+ switch (retval) {
168
+ case 'b': case 'e':
169
+ if ((expv + 1) > FLT128_DIG)
170
+ {
171
+ int index = FLT128_DIG;
172
+ switch (s[index+offset]) {
173
+ case '9':
174
+ s[index+offset] = '\0';
175
+ for (; (index+offset-1) >= offset; index--)
176
+ {
177
+ if (s[index+offset-1] == '9')
178
+ {
179
+ s[index+offset-1] = '\0';
180
+ if ((index+offset-1) == offset)
181
+ {
182
+ s[index+offset-1] = '\0'; offset--; s[index+offset-1] = '1';
183
+ expv++;
184
+ break;
185
+ }
186
+ }
187
+ else
188
+ {
189
+ s[index+offset-1] += 1;
190
+ break;
191
+ }
192
+ }
193
+ break;
194
+ default:
195
+ s[offset+index] = '\0';
196
+ index--;
197
+
198
+ if (s[offset+index] == '0')
199
+ {
200
+ for (; (index+offset-1) >= offset; index--)
201
+ {
202
+ if (s[index+offset-1] == '0')
203
+ s[index+offset-1] = '\0';
204
+ else
205
+ break;
206
+ }
207
+ }
208
+ break;
209
+ }
210
+ switch (retval) {
211
+ case 'b':
212
+
213
+ if (offset == RADIX2_OFFSET)
214
+ {
215
+ s[0] = '0'; s[1] = '.'; offset = 0;
216
+ }
217
+ else
218
+ {
219
+ s[2] = s[1]; s[0] = '0'; s[1] = '.'; offset = 0;
220
+ }
221
+ break;
222
+ case 'e':
223
+ if (offset == RADIX10_OFFSET)
224
+ {
225
+ s[0] = s[1]; s[1] = '.'; offset = 0;
226
+ if (s[2] == 0) s[2] = '0';
227
+ }
228
+ else
229
+ {
230
+ s[1] = '.'; s[2] = '0';
231
+ }
232
+ break;
233
+ default:
234
+ break;
235
+ }
236
+ }
237
+ else
238
+ {
239
+ for (; pos > 0; pos--)
240
+ {
241
+ s[pos+offset] = s[pos+offset-1]; s[pos+offset-1] = '.';
242
+ }
243
+ pos = strlen(s+offset);
244
+ if (pos > FLT128_DIG+3)
245
+ {
246
+ s[offset+FLT128_DIG+3] = '\0'; pos = FLT128_DIG+3;
247
+ }
248
+ switch (s[offset+pos-2]) {
249
+ case '9':
250
+
251
+ for (; s[offset+pos-1] != '.'; pos--)
252
+ {
253
+ if (s[offset+pos-1] == '9')
254
+ {
255
+ s[offset+pos-1] = '\0';
256
+ if ((offset+pos-1) == offset)
257
+ {
258
+ s[offset+pos-1] = '1';
259
+ expv++;
260
+ }
261
+ }
262
+ else
263
+ {
264
+ s[offset+pos-1] += 1;
265
+ break;
266
+ }
267
+ }
268
+ break;
269
+ case '0':
270
+ for (; pos != 0; pos--)
271
+ {
272
+ if (s[offset+pos-1] == '0')
273
+ s[offset+pos-1] = '\0';
274
+ else
275
+ break;
276
+ }
277
+ break;
278
+ default:
279
+ break;
280
+ }
281
+ switch (retval) {
282
+ case 'b':
283
+ offset--; s[offset] = '0';
284
+ break;
285
+ case 'e':
286
+ s[offset] = s[offset+1]; s[offset+1] = '.';
287
+ if (s[offset+2] == 0) s[offset+2] = '0';
288
+ break;
289
+ default:
290
+ break;
291
+ }
292
+ }
293
+ break;
294
+ case 'f':
295
+ #if 0
296
+ int intdigit = expv + 1, fradigit = FLT128_DIG - intdigit;
297
+ #else
298
+ int intdigit = expv + 1, fradigit = FLT128_DIG - intdigit + 2; // BUG-FIX
299
+ #endif
300
+ if (fradigit < 0) fradigit = 0;
301
+ if ((expv + 1) > FLT128_DIG)
302
+ {
303
+ for (volatile int i = strlen(s+offset); (intdigit + 2) < i; i--)
304
+ {
305
+ if (s[i] != '0') break;
306
+ else s[i] = '\0';
307
+ }
308
+ }
309
+ else
310
+ {
311
+ const int fra_pos = intdigit + 1;
312
+ int s_fra_size = strlen(s+offset) - intdigit - 1;
313
+ if (s_fra_size < fradigit)
314
+ {
315
+ for (; s_fra_size < fradigit; s_fra_size++)
316
+ {
317
+ s[offset+fra_pos+s_fra_size] = '0';
318
+ }
319
+ }
320
+ if (s[offset+fra_pos+fradigit] == '9')
321
+ {
322
+ s[offset+fra_pos+fradigit] = '\0';
323
+ for (int i = 0; i < fradigit; i++)
324
+ {
325
+ char *ptr = (s + offset + fra_pos + fradigit - i - 1);
326
+ if (*ptr == '9')
327
+ *ptr = 0;
328
+ else
329
+ {
330
+ *ptr += 1;
331
+ break;
332
+ }
333
+ }
334
+ if (s[offset+fra_pos] == 0)
335
+ {
336
+ s[offset+fra_pos] = '0'; s[offset+fra_pos+1] = '\0';
337
+ for (int i = 0; i < intdigit; i++)
338
+ {
339
+ char *ptr = (s + offset + intdigit - i - 1);
340
+ if (*ptr == '9')
341
+ *ptr = '0';
342
+ else
343
+ {
344
+ *ptr += 1;
345
+ break;
346
+ }
347
+ }
348
+ if (s[offset] == '0')
349
+ {
350
+ offset--; s[offset] = '1';
351
+ expv++;
352
+ }
353
+ }
354
+ }
355
+ else
356
+ {
357
+ s[offset+fra_pos+fradigit] = '\0';
358
+ if (s[offset+fra_pos+fradigit-1] == '0')
359
+ {
360
+ for (int i = 0; i < (fradigit - 1); i++)
361
+ {
362
+ char *ptr = (s + offset + fra_pos + fradigit - i - 1);
363
+ if (*ptr == '0') *ptr = 0;
364
+ else break;
365
+ }
366
+ if (s[offset+fra_pos] == 0) { s[offset+fra_pos] = '0'; s[offset+fra_pos+1] = '\0'; }
367
+ }
368
+ }
369
+ }
370
+ default:
371
+ break;
372
+ }
373
+ *buf = s+offset;
374
+ }
375
+ else if (absx < 10 && absx > 1)
376
+ {
377
+ int denormal_first_digit = 0;
378
+ expv = 0;
379
+ if (retval == 'g')
380
+ {
381
+ retval = 'f';
382
+ }
383
+ #if 0
384
+ quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", FLT128_DIG, absx / 10);
385
+ denormal_first_digit = strlen(s+offset) - 1;
386
+ #else
387
+ quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", FLT128_DIG + 2, absx / 10); // BUG-FIX
388
+ denormal_first_digit = strlen(s+offset); // BUG-FIX
389
+ #endif
390
+ if (s[offset+denormal_first_digit] == 9)
391
+ {
392
+ s[offset+denormal_first_digit] = '\0';
393
+ for (int i = 0; i < (denormal_first_digit - 1); i++)
394
+ {
395
+ char *ptr = (s + offset + denormal_first_digit - i - 1);
396
+ if (*ptr == '9')
397
+ *ptr = 0;
398
+ else if (*ptr == '.')
399
+ {
400
+ ptr[1] = '1';
401
+ expv++;
402
+ break;
403
+ }
404
+ else
405
+ {
406
+ *ptr += 1;
407
+ break;
408
+ }
409
+ }
410
+ }
411
+ else
412
+ {
413
+ s[offset+denormal_first_digit] = '\0';
414
+
415
+ if (s[offset+denormal_first_digit-1] == '0')
416
+ {
417
+ for (int i = 0; i < (denormal_first_digit - 2); i++)
418
+ {
419
+ char *ptr = (s + offset + denormal_first_digit - i - 2);
420
+ if (*ptr == '0') *ptr = 0;
421
+ else break;
422
+ }
423
+ }
424
+ }
425
+ switch (retval) {
426
+ case 'b':
427
+ expv++;
428
+ break;
429
+ case 'e': case 'f':
430
+ if (expv != 0)
431
+ {
432
+ char *ptr = s+offset;
433
+
434
+ if (retval == 'e')
435
+ {
436
+ *ptr++ = '1'; *ptr++ = '.'; *ptr++ = '0'; *ptr++ = 0;
437
+ }
438
+ else
439
+ {
440
+ *ptr++ = '1'; *ptr++ = '0'; *ptr++ = '.'; *ptr++ = '0'; *ptr++ = 0;
441
+ }
442
+ }
443
+ else
444
+ {
445
+ s[offset] = '\0'; offset++;
446
+ s[offset] = s[offset+1];
447
+ s[offset+1] = '.';
448
+ if (s[offset+2] == 0) s[offset+2] = '0';
449
+ }
450
+ break;
451
+ default:
452
+ break;
453
+ }
454
+ *buf = s+offset;
455
+ }
456
+ else if (absx == 1)
457
+ {
458
+ if (retval == 'g')
459
+ {
460
+ retval = 'f';
461
+ }
462
+ switch (retval) {
463
+ case 'b': /* radix == 2 */
464
+ s[0] = '0'; s[1] = '.'; s[2] = '1'; s[3] = '\0';
465
+ expv = 1;
466
+ break;
467
+ case 'e': case 'f': /* radix == 10 */
468
+ s[0] = '1'; s[1] = '.'; s[2] = '0'; s[3] = '\0';
469
+ expv = 0;
470
+ break;
471
+ default:
472
+ break;
473
+ }
474
+ *buf = s;
475
+ }
476
+ else if (absx >= 0.1)
477
+ {
478
+ #if 0
479
+ int len = quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", FLT128_DIG, absx);
480
+ #else
481
+ int len = quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", FLT128_DIG + 1, absx); // BUG-FIX
482
+ #endif
483
+ if (retval == 'g') retval = 'f';
484
+
485
+ if (s[offset] == '1')
486
+ strcpy(s+offset, near_one);
487
+ else
488
+ {
489
+ if (s[offset+len-1] == '0')
490
+ {
491
+ for (int i = 0; i < (len - 2); i++)
492
+ {
493
+ if (s[offset+len-i-1] == '0')
494
+ s[offset+len-i-1] = '\0';
495
+ else
496
+ break;
497
+ }
498
+ }
499
+ }
500
+
501
+ if (retval == 'e')
502
+ {
503
+ s[offset] = '\0'; s[offset+1] = s[offset+2]; s[offset+2] = '.';
504
+ offset++;
505
+ expv--;
506
+ }
507
+
508
+ *buf = s+offset;
509
+ }
510
+ else /* if (absx < 0.1) */
511
+ {
512
+ __float128 w = absx;
513
+ int len = 0;
514
+ if (retval == 'g')
515
+ {
516
+ retval = (w <= FRAC_DIG) ? 'e' : 'f';
517
+ }
518
+ switch (retval) {
519
+ case 'b':
520
+ for (expv = 0; w < 0.1; w = foo(w * 10)) expv++;
521
+ expv = -expv;
522
+ #if 0
523
+ len = quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", FLT128_DIG, w);
524
+ #else
525
+ len = quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", FLT128_DIG + 1, w); // BUG-FIX
526
+ #endif
527
+ if (s[offset] != '0')
528
+ {
529
+ #if 0
530
+ s[offset+len-1] = '\0';
531
+ #endif
532
+ s[offset+1] = s[offset]; s[offset] = '.';
533
+ offset--;
534
+ s[offset] = '0';
535
+ expv--;
536
+ }
537
+ #if 0
538
+ switch (s[offset+len-1]) {
539
+ #else
540
+ switch (s[offset+len]) {
541
+ #endif
542
+ case '0':
543
+ for (int i = 0; i < (len - 2); i++)
544
+ {
545
+ #if 0
546
+ if (s[offset+len-i-1] == '0')
547
+ s[offset+len-i-1] = '\0';
548
+ #else
549
+ if (s[offset+len-i] == '0')
550
+ s[offset+len-i] = '\0';
551
+ #endif
552
+ else
553
+ break;
554
+ }
555
+ break;
556
+ default:
557
+ break;
558
+ }
559
+
560
+ break;
561
+ case 'e':
562
+
563
+ for (expv = 0; w < 0.1; w = foo(w * 10)) expv++;
564
+ expv = -expv;
565
+ expv--;
566
+ #if 0
567
+ len = quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", FLT128_DIG, w);
568
+ #else
569
+ len = quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", FLT128_DIG + 1, w); // BUG-FIX
570
+ #endif
571
+ if (s[offset] != '0')
572
+ {
573
+ #if 0
574
+ s[offset+len-1] = '\0';
575
+ #endif
576
+ s[offset+1] = s[offset]; s[offset] = '.';
577
+ offset--;
578
+ s[offset] = '0';
579
+ expv++;
580
+ }
581
+ #if 0
582
+ switch (s[offset+len-1]) {
583
+ #else
584
+ switch (s[offset+len]) { // BUG-FIX
585
+ #endif
586
+ case '0':
587
+ for (int i = 0; i < (len - 2); i++)
588
+ {
589
+ #if 0
590
+ if (s[offset+len-i-1] == '0')
591
+ s[offset+len-i-1] = '\0';
592
+ #else
593
+ if (s[offset+len-i] == '0') // BUG-FIX
594
+ s[offset+len-i] = '\0'; // BUG-FIX
595
+ #endif
596
+ else
597
+ break;
598
+ }
599
+ break;
600
+ default:
601
+ break;
602
+ }
603
+
604
+ s[offset] = '\0'; offset++; s[offset] = s[offset+1]; s[offset+1] = '.';
605
+ if (s[offset+2] == '\0') s[offset+2] = '0';
606
+
607
+ break;
608
+ case 'f':
609
+ for (expv = 0; w < 1; w = foo(w * 10)) expv++;
610
+ expv--;
611
+ #if 0
612
+ len = quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", expv+FLT128_DIG+1, absx);
613
+ #else
614
+ len = quadmath_snprintf(s+offset, BUF_SIZE-offset, "%.*Qf", expv+FLT128_DIG+2, absx); // BUG-FIX
615
+ #endif
616
+ expv = -expv;
617
+ #if 0
618
+ if (s[offset+len-1] == '9')
619
+ {
620
+ s[offset+len-1] = '\0';
621
+ len--;
622
+ for (int i = 0; i <= FLT128_DIG; i++)
623
+ {
624
+ if (s[offset+len-i-1] == '9')
625
+ {
626
+ s[offset+len-i-1] = '\0';
627
+ }
628
+ else
629
+ {
630
+ s[offset+len-i-1] += 1;
631
+ break;
632
+ }
633
+ }
634
+ }
635
+ #else
636
+ // BUG-FIX
637
+ if (s[offset+len-2] == '9')
638
+ {
639
+ s[offset+len-2] = '\0';
640
+ len--;
641
+ for (int i = 0; i <= FLT128_DIG; i++)
642
+ {
643
+ if (s[offset+len-i-2] == '9')
644
+ {
645
+ s[offset+len-i-2] = '\0';
646
+ }
647
+ else
648
+ {
649
+ s[offset+len-i-2] += 1;
650
+ break;
651
+ }
652
+ }
653
+ }
654
+ #endif
655
+ else
656
+ {
657
+ #if 0
658
+ s[offset+len-1] = '\0'; // BUG-FIX
659
+ #endif
660
+ len--;
661
+ #if 0
662
+ if (s[offset+len-1] == '0')
663
+ #else
664
+ if (s[offset+len] == '0') // BUG-FIX
665
+ #endif
666
+ {
667
+ for (int i = 0; i <= FLT128_DIG; i++)
668
+ {
669
+ if (s[offset+len-i-1] == '0')
670
+ {
671
+ s[offset+len-i-1] = '\0';
672
+ }
673
+ else
674
+ {
675
+ break;
676
+ }
677
+ }
678
+ }
679
+ break;
680
+ }
681
+ default:
682
+ break;
683
+ }
684
+ *buf = s+offset;
685
+ }
686
+ }
687
+ end:
688
+ *exp = expv;
689
+ *sign = signv;
690
+ return retval;
691
+ }
692
+
693
+ #ifdef TEST
694
+ int
695
+ main(int argc, char const *argv[])
696
+ {
697
+ char* str;
698
+ __float128 x;
699
+ int exp, sign;
700
+ char format;
701
+ if (argc != 3)
702
+ {
703
+ fprintf(stderr, "Usage: %s [format (b,e,f,g)] [float-number]\n", argv[0]);
704
+ exit(1);
705
+ }
706
+ format = argv[1][0];
707
+ x = strtoflt128 (argv[2], NULL);
708
+
709
+ switch (ool_quad2str(x, format, &exp, &sign, &str)) {
710
+ case '0':
711
+ break;
712
+ case '1':
713
+ if (sign == -1) printf("-%s\n", str);
714
+ else printf("%s\n", str);
715
+ break;
716
+ case 'a':
717
+ if (sign == -1) printf("-%sp%+d\n", str, exp);
718
+ else printf("%sp%+d\n", str, exp);
719
+ break;
720
+ case 'b':
721
+ if (sign == -1) printf("-%se%+d\n", str, exp);
722
+ else printf("%se%+d\n", str, exp);
723
+ break;
724
+ case 'e':
725
+ if (sign == -1) printf("-%se%+d\n", str, exp);
726
+ else printf("%se%+d\n", str, exp);
727
+ break;
728
+ case 'f':
729
+ if (sign == -1) printf("-%s\n", str);
730
+ else printf("%s\n", str);
731
+ break;
732
+ default:
733
+ break;
734
+ }
735
+
736
+ return 0;
737
+ }
738
+ #endif