This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Math::BigInt 1.41.
[perl5.git] / numeric.c
1 /*    numeric.c
2  *
3  *    Copyright (c) 2001, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 /*
11  * "That only makes eleven (plus one mislaid) and not fourteen, unless
12  * wizards count differently to other people."
13  */
14
15 #include "EXTERN.h"
16 #define PERL_IN_NUMERIC_C
17 #include "perl.h"
18
19 U32
20 Perl_cast_ulong(pTHX_ NV f)
21 {
22   if (f < 0.0)
23     return f < I32_MIN ? (U32) I32_MIN : (U32)(I32) f;
24   if (f < U32_MAX_P1) {
25 #if CASTFLAGS & 2
26     if (f < U32_MAX_P1_HALF)
27       return (U32) f;
28     f -= U32_MAX_P1_HALF;
29     return ((U32) f) | (1 + U32_MAX >> 1);
30 #else
31     return (U32) f;
32 #endif
33   }
34   return f > 0 ? U32_MAX : 0 /* NaN */;
35 }
36
37 I32
38 Perl_cast_i32(pTHX_ NV f)
39 {
40   if (f < I32_MAX_P1)
41     return f < I32_MIN ? I32_MIN : (I32) f;
42   if (f < U32_MAX_P1) {
43 #if CASTFLAGS & 2
44     if (f < U32_MAX_P1_HALF)
45       return (I32)(U32) f;
46     f -= U32_MAX_P1_HALF;
47     return (I32)(((U32) f) | (1 + U32_MAX >> 1));
48 #else
49     return (I32)(U32) f;
50 #endif
51   }
52   return f > 0 ? (I32)U32_MAX : 0 /* NaN */;
53 }
54
55 IV
56 Perl_cast_iv(pTHX_ NV f)
57 {
58   if (f < IV_MAX_P1)
59     return f < IV_MIN ? IV_MIN : (IV) f;
60   if (f < UV_MAX_P1) {
61 #if CASTFLAGS & 2
62     /* For future flexibility allowing for sizeof(UV) >= sizeof(IV)  */
63     if (f < UV_MAX_P1_HALF)
64       return (IV)(UV) f;
65     f -= UV_MAX_P1_HALF;
66     return (IV)(((UV) f) | (1 + UV_MAX >> 1));
67 #else
68     return (IV)(UV) f;
69 #endif
70   }
71   return f > 0 ? (IV)UV_MAX : 0 /* NaN */;
72 }
73
74 UV
75 Perl_cast_uv(pTHX_ NV f)
76 {
77   if (f < 0.0)
78     return f < IV_MIN ? (UV) IV_MIN : (UV)(IV) f;
79   if (f < UV_MAX_P1) {
80 #if CASTFLAGS & 2
81     if (f < UV_MAX_P1_HALF)
82       return (UV) f;
83     f -= UV_MAX_P1_HALF;
84     return ((UV) f) | (1 + UV_MAX >> 1);
85 #else
86     return (UV) f;
87 #endif
88   }
89   return f > 0 ? UV_MAX : 0 /* NaN */;
90 }
91
92 #if defined(HUGE_VAL) || (defined(USE_LONG_DOUBLE) && defined(HUGE_VALL))
93 /*
94  * This hack is to force load of "huge" support from libm.a
95  * So it is in perl for (say) POSIX to use.
96  * Needed for SunOS with Sun's 'acc' for example.
97  */
98 NV
99 Perl_huge(void)
100 {
101 #   if defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)
102     return HUGE_VALL;
103 #   endif
104     return HUGE_VAL;
105 }
106 #endif
107
108 NV
109 Perl_scan_bin(pTHX_ char *start, STRLEN len, STRLEN *retlen)
110 {
111     register char *s = start;
112     register NV rnv = 0.0;
113     register UV ruv = 0;
114     register bool seenb = FALSE;
115     register bool overflowed = FALSE;
116
117     for (; len-- && *s; s++) {
118         if (!(*s == '0' || *s == '1')) {
119             if (*s == '_' && len && *retlen
120                 && (s[1] == '0' || s[1] == '1'))
121             {
122                 --len;
123                 ++s;
124             }
125             else if (seenb == FALSE && *s == 'b' && ruv == 0) {
126                 /* Disallow 0bbb0b0bbb... */
127                 seenb = TRUE;
128                 continue;
129             }
130             else {
131                 if (ckWARN(WARN_DIGIT))
132                     Perl_warner(aTHX_ WARN_DIGIT,
133                                 "Illegal binary digit '%c' ignored", *s);
134                 break;
135             }
136         }
137         if (!overflowed) {
138             register UV xuv = ruv << 1;
139
140             if ((xuv >> 1) != ruv) {
141                 overflowed = TRUE;
142                 rnv = (NV) ruv;
143                 if (ckWARN_d(WARN_OVERFLOW))
144                     Perl_warner(aTHX_ WARN_OVERFLOW,
145                                 "Integer overflow in binary number");
146             }
147             else
148                 ruv = xuv | (*s - '0');
149         }
150         if (overflowed) {
151             rnv *= 2;
152             /* If an NV has not enough bits in its mantissa to
153              * represent an UV this summing of small low-order numbers
154              * is a waste of time (because the NV cannot preserve
155              * the low-order bits anyway): we could just remember when
156              * did we overflow and in the end just multiply rnv by the
157              * right amount. */
158             rnv += (*s - '0');
159         }
160     }
161     if (!overflowed)
162         rnv = (NV) ruv;
163     if (   ( overflowed && rnv > 4294967295.0)
164 #if UVSIZE > 4
165         || (!overflowed && ruv > 0xffffffff  )
166 #endif
167         ) {
168         if (ckWARN(WARN_PORTABLE))
169             Perl_warner(aTHX_ WARN_PORTABLE,
170                         "Binary number > 0b11111111111111111111111111111111 non-portable");
171     }
172     *retlen = s - start;
173     return rnv;
174 }
175
176 NV
177 Perl_scan_oct(pTHX_ char *start, STRLEN len, STRLEN *retlen)
178 {
179     register char *s = start;
180     register NV rnv = 0.0;
181     register UV ruv = 0;
182     register bool overflowed = FALSE;
183
184     for (; len-- && *s; s++) {
185         if (!(*s >= '0' && *s <= '7')) {
186             if (*s == '_' && len && *retlen
187                 && (s[1] >= '0' && s[1] <= '7'))
188             {
189                 --len;
190                 ++s;
191             }
192             else {
193                 /* Allow \octal to work the DWIM way (that is, stop scanning
194                  * as soon as non-octal characters are seen, complain only iff
195                  * someone seems to want to use the digits eight and nine). */
196                 if (*s == '8' || *s == '9') {
197                     if (ckWARN(WARN_DIGIT))
198                         Perl_warner(aTHX_ WARN_DIGIT,
199                                     "Illegal octal digit '%c' ignored", *s);
200                 }
201                 break;
202             }
203         }
204         if (!overflowed) {
205             register UV xuv = ruv << 3;
206
207             if ((xuv >> 3) != ruv) {
208                 overflowed = TRUE;
209                 rnv = (NV) ruv;
210                 if (ckWARN_d(WARN_OVERFLOW))
211                     Perl_warner(aTHX_ WARN_OVERFLOW,
212                                 "Integer overflow in octal number");
213             }
214             else
215                 ruv = xuv | (*s - '0');
216         }
217         if (overflowed) {
218             rnv *= 8.0;
219             /* If an NV has not enough bits in its mantissa to
220              * represent an UV this summing of small low-order numbers
221              * is a waste of time (because the NV cannot preserve
222              * the low-order bits anyway): we could just remember when
223              * did we overflow and in the end just multiply rnv by the
224              * right amount of 8-tuples. */
225             rnv += (NV)(*s - '0');
226         }
227     }
228     if (!overflowed)
229         rnv = (NV) ruv;
230     if (   ( overflowed && rnv > 4294967295.0)
231 #if UVSIZE > 4
232         || (!overflowed && ruv > 0xffffffff  )
233 #endif
234         ) {
235         if (ckWARN(WARN_PORTABLE))
236             Perl_warner(aTHX_ WARN_PORTABLE,
237                         "Octal number > 037777777777 non-portable");
238     }
239     *retlen = s - start;
240     return rnv;
241 }
242
243 NV
244 Perl_scan_hex(pTHX_ char *start, STRLEN len, STRLEN *retlen)
245 {
246     register char *s = start;
247     register NV rnv = 0.0;
248     register UV ruv = 0;
249     register bool overflowed = FALSE;
250     char *hexdigit;
251
252     if (len > 2) {
253         if (s[0] == 'x') {
254             s++;
255             len--;
256         }
257         else if (len > 3 && s[0] == '0' && s[1] == 'x') {
258             s+=2;
259             len-=2;
260         }
261     }
262
263     for (; len-- && *s; s++) {
264         hexdigit = strchr((char *) PL_hexdigit, *s);
265         if (!hexdigit) {
266             if (*s == '_' && len && *retlen && s[1]
267                 && (hexdigit = strchr((char *) PL_hexdigit, s[1])))
268             {
269                 --len;
270                 ++s;
271             }
272             else {
273                 if (ckWARN(WARN_DIGIT))
274                     Perl_warner(aTHX_ WARN_DIGIT,
275                                 "Illegal hexadecimal digit '%c' ignored", *s);
276                 break;
277             }
278         }
279         if (!overflowed) {
280             register UV xuv = ruv << 4;
281
282             if ((xuv >> 4) != ruv) {
283                 overflowed = TRUE;
284                 rnv = (NV) ruv;
285                 if (ckWARN_d(WARN_OVERFLOW))
286                     Perl_warner(aTHX_ WARN_OVERFLOW,
287                                 "Integer overflow in hexadecimal number");
288             }
289             else
290                 ruv = xuv | ((hexdigit - PL_hexdigit) & 15);
291         }
292         if (overflowed) {
293             rnv *= 16.0;
294             /* If an NV has not enough bits in its mantissa to
295              * represent an UV this summing of small low-order numbers
296              * is a waste of time (because the NV cannot preserve
297              * the low-order bits anyway): we could just remember when
298              * did we overflow and in the end just multiply rnv by the
299              * right amount of 16-tuples. */
300             rnv += (NV)((hexdigit - PL_hexdigit) & 15);
301         }
302     }
303     if (!overflowed)
304         rnv = (NV) ruv;
305     if (   ( overflowed && rnv > 4294967295.0)
306 #if UVSIZE > 4
307         || (!overflowed && ruv > 0xffffffff  )
308 #endif
309         ) {
310         if (ckWARN(WARN_PORTABLE))
311             Perl_warner(aTHX_ WARN_PORTABLE,
312                         "Hexadecimal number > 0xffffffff non-portable");
313     }
314     *retlen = s - start;
315     return rnv;
316 }
317
318 /*
319 =for apidoc grok_numeric_radix
320
321 Scan and skip for a numeric decimal separator (radix).
322
323 =cut
324  */
325 bool
326 Perl_grok_numeric_radix(pTHX_ const char **sp, const char *send)
327 {
328 #ifdef USE_LOCALE_NUMERIC
329     if (PL_numeric_radix_sv && IN_LOCALE) { 
330         STRLEN len;
331         char* radix = SvPV(PL_numeric_radix_sv, len);
332         if (*sp + len <= send && memEQ(*sp, radix, len)) {
333             *sp += len;
334             return TRUE; 
335         }
336     }
337     /* always try "." if numeric radix didn't match because
338      * we may have data from different locales mixed */
339 #endif
340     if (*sp < send && **sp == '.') {
341         ++*sp;
342         return TRUE;
343     }
344     return FALSE;
345 }
346
347 /*
348 =for apidoc grok_number
349
350 Recognise (or not) a number.  The type of the number is returned
351 (0 if unrecognised), otherwise it is a bit-ORed combination of
352 IS_NUMBER_IN_UV, IS_NUMBER_GREATER_THAN_UV_MAX, IS_NUMBER_NOT_INT,
353 IS_NUMBER_NEG, IS_NUMBER_INFINITY, IS_NUMBER_NAN (defined in perl.h).
354
355 If the value of the number can fit an in UV, it is returned in the *valuep
356 IS_NUMBER_IN_UV will be set to indicate that *valuep is valid, IS_NUMBER_IN_UV
357 will never be set unless *valuep is valid, but *valuep may have been assigned
358 to during processing even though IS_NUMBER_IN_UV is not set on return.
359 If valuep is NULL, IS_NUMBER_IN_UV will be set for the same cases as when
360 valuep is non-NULL, but no actual assignment (or SEGV) will occur.
361
362 IS_NUMBER_NOT_INT will be set with IS_NUMBER_IN_UV if trailing decimals were
363 seen (in which case *valuep gives the true value truncated to an integer), and
364 IS_NUMBER_NEG if the number is negative (in which case *valuep holds the
365 absolute value).  IS_NUMBER_IN_UV is not set if e notation was used or the
366 number is larger than a UV.
367
368 =cut
369  */
370 int
371 Perl_grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep)
372 {
373   const char *s = pv;
374   const char *send = pv + len;
375   const UV max_div_10 = UV_MAX / 10;
376   const char max_mod_10 = UV_MAX % 10;
377   int numtype = 0;
378   int sawinf = 0;
379   int sawnan = 0;
380
381   while (s < send && isSPACE(*s))
382     s++;
383   if (s == send) {
384     return 0;
385   } else if (*s == '-') {
386     s++;
387     numtype = IS_NUMBER_NEG;
388   }
389   else if (*s == '+')
390   s++;
391
392   if (s == send)
393     return 0;
394
395   /* next must be digit or the radix separator or beginning of infinity */
396   if (isDIGIT(*s)) {
397     /* UVs are at least 32 bits, so the first 9 decimal digits cannot
398        overflow.  */
399     UV value = *s - '0';
400     /* This construction seems to be more optimiser friendly.
401        (without it gcc does the isDIGIT test and the *s - '0' separately)
402        With it gcc on arm is managing 6 instructions (6 cycles) per digit.
403        In theory the optimiser could deduce how far to unroll the loop
404        before checking for overflow.  */
405     if (++s < send) {
406       int digit = *s - '0';
407       if (digit >= 0 && digit <= 9) {
408         value = value * 10 + digit;
409         if (++s < send) {
410           digit = *s - '0';
411           if (digit >= 0 && digit <= 9) {
412             value = value * 10 + digit;
413             if (++s < send) {
414               digit = *s - '0';
415               if (digit >= 0 && digit <= 9) {
416                 value = value * 10 + digit;
417                 if (++s < send) {
418                   digit = *s - '0';
419                   if (digit >= 0 && digit <= 9) {
420                     value = value * 10 + digit;
421                     if (++s < send) {
422                       digit = *s - '0';
423                       if (digit >= 0 && digit <= 9) {
424                         value = value * 10 + digit;
425                         if (++s < send) {
426                           digit = *s - '0';
427                           if (digit >= 0 && digit <= 9) {
428                             value = value * 10 + digit;
429                             if (++s < send) {
430                               digit = *s - '0';
431                               if (digit >= 0 && digit <= 9) {
432                                 value = value * 10 + digit;
433                                 if (++s < send) {
434                                   digit = *s - '0';
435                                   if (digit >= 0 && digit <= 9) {
436                                     value = value * 10 + digit;
437                                     if (++s < send) {
438                                       /* Now got 9 digits, so need to check
439                                          each time for overflow.  */
440                                       digit = *s - '0';
441                                       while (digit >= 0 && digit <= 9
442                                              && (value < max_div_10
443                                                  || (value == max_div_10
444                                                      && digit <= max_mod_10))) {
445                                         value = value * 10 + digit;
446                                         if (++s < send)
447                                           digit = *s - '0';
448                                         else
449                                           break;
450                                       }
451                                       if (digit >= 0 && digit <= 9
452                                           && (s < send)) {
453                                         /* value overflowed.
454                                            skip the remaining digits, don't
455                                            worry about setting *valuep.  */
456                                         do {
457                                           s++;
458                                         } while (s < send && isDIGIT(*s));
459                                         numtype |=
460                                           IS_NUMBER_GREATER_THAN_UV_MAX;
461                                         goto skip_value;
462                                       }
463                                     }
464                                   }
465                                 }
466                               }
467                             }
468                           }
469                         }
470                       }
471                     }
472                   }
473                 }
474               }
475             }
476           }
477         }
478       }
479     }
480     numtype |= IS_NUMBER_IN_UV;
481     if (valuep)
482       *valuep = value;
483
484   skip_value:
485     if (GROK_NUMERIC_RADIX(&s, send)) {
486       numtype |= IS_NUMBER_NOT_INT;
487       while (s < send && isDIGIT(*s))  /* optional digits after the radix */
488         s++;
489     }
490   }
491   else if (GROK_NUMERIC_RADIX(&s, send)) {
492     numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
493     /* no digits before the radix means we need digits after it */
494     if (s < send && isDIGIT(*s)) {
495       do {
496         s++;
497       } while (s < send && isDIGIT(*s));
498       if (valuep) {
499         /* integer approximation is valid - it's 0.  */
500         *valuep = 0;
501       }
502     }
503     else
504       return 0;
505   } else if (*s == 'I' || *s == 'i') {
506     s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
507     s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
508     s++; if (s < send && (*s == 'I' || *s == 'i')) {
509       s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
510       s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
511       s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
512       s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
513       s++;
514     }
515     sawinf = 1;
516   } else if (*s == 'N' || *s == 'n') {
517     /* XXX TODO: There are signaling NaNs and quiet NaNs. */
518     s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
519     s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
520     s++;
521     sawnan = 1;
522   } else
523     return 0;
524
525   if (sawinf) {
526     numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
527     numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
528   } else if (sawnan) {
529     numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
530     numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
531   } else if (s < send) {
532     /* we can have an optional exponent part */
533     if (*s == 'e' || *s == 'E') {
534       /* The only flag we keep is sign.  Blow away any "it's UV"  */
535       numtype &= IS_NUMBER_NEG;
536       numtype |= IS_NUMBER_NOT_INT;
537       s++;
538       if (s < send && (*s == '-' || *s == '+'))
539         s++;
540       if (s < send && isDIGIT(*s)) {
541         do {
542           s++;
543         } while (s < send && isDIGIT(*s));
544       }
545       else
546       return 0;
547     }
548   }
549   while (s < send && isSPACE(*s))
550     s++;
551   if (s >= send)
552     return numtype;
553   if (len == 10 && memEQ(pv, "0 but true", 10)) {
554     if (valuep)
555       *valuep = 0;
556     return IS_NUMBER_IN_UV;
557   }
558   return 0;
559 }
560
561 NV
562 S_mulexp10(NV value, I32 exponent)
563 {
564     NV result = 1.0;
565     NV power = 10.0;
566     bool negative = 0;
567     I32 bit;
568
569     if (exponent == 0)
570         return value;
571     else if (exponent < 0) {
572         negative = 1;
573         exponent = -exponent;
574     }
575     for (bit = 1; exponent; bit <<= 1) {
576         if (exponent & bit) {
577             exponent ^= bit;
578             result *= power;
579         }
580         /* Floating point exceptions are supposed to be turned off. */
581         power *= power;
582     }
583     return negative ? value / result : value * result;
584 }
585
586 NV
587 Perl_my_atof(pTHX_ const char* s)
588 {
589     NV x = 0.0;
590 #ifdef USE_LOCALE_NUMERIC
591     if (PL_numeric_local && IN_LOCALE) {
592         NV y;
593
594         /* Scan the number twice; once using locale and once without;
595          * choose the larger result (in absolute value). */
596         Perl_atof2(aTHX_ s, &x);
597         SET_NUMERIC_STANDARD();
598         Perl_atof2(aTHX_ s, &y);
599         SET_NUMERIC_LOCAL();
600         if ((y < 0.0 && y < x) || (y > 0.0 && y > x))
601             return y;
602     }
603     else
604         Perl_atof2(aTHX_ s, &x);
605 #else
606     Perl_atof2(aTHX_ s, &x);
607 #endif
608     return x;
609 }
610
611 char*
612 Perl_my_atof2(pTHX_ const char* orig, NV* value)
613 {
614     NV result = 0.0;
615     bool negative = 0;
616     char* s = (char*)orig;
617     char* send = s + strlen(orig) - 1;
618     bool seendigit = 0;
619     I32 expextra = 0;
620     I32 exponent = 0;
621     I32 i;
622 /* this is arbitrary */
623 #define PARTLIM 6
624 /* we want the largest integers we can usefully use */
625 #if defined(HAS_QUAD) && defined(USE_64_BIT_INT)
626 #   define PARTSIZE ((int)TYPE_DIGITS(U64)-1)
627     U64 part[PARTLIM];
628 #else
629 #   define PARTSIZE ((int)TYPE_DIGITS(U32)-1)
630     U32 part[PARTLIM];
631 #endif
632     I32 ipart = 0;      /* index into part[] */
633     I32 offcount;       /* number of digits in least significant part */
634
635     /* leading whitespace */
636     while (isSPACE(*s))
637         ++s;
638
639     /* sign */
640     switch (*s) {
641         case '-':
642             negative = 1;
643             /* fall through */
644         case '+':
645             ++s;
646     }
647
648     part[0] = offcount = 0;
649     if (isDIGIT(*s)) {
650         seendigit = 1;  /* get this over with */
651
652         /* skip leading zeros */
653         while (*s == '0')
654             ++s;
655     }
656
657     /* integer digits */
658     while (isDIGIT(*s)) {
659         if (++offcount > PARTSIZE) {
660             if (++ipart < PARTLIM) {
661                 part[ipart] = 0;
662                 offcount = 1;   /* ++0 */
663             }
664             else {
665                 /* limits of precision reached */
666                 --ipart;
667                 --offcount;
668                 if (*s >= '5')
669                     ++part[ipart];
670                 while (isDIGIT(*s)) {
671                     ++expextra;
672                     ++s;
673                 }
674                 /* warn of loss of precision? */
675                 break;
676             }
677         }
678         part[ipart] = part[ipart] * 10 + (*s++ - '0');
679     }
680
681     /* decimal point */
682     if (GROK_NUMERIC_RADIX((const char **)&s, send)) {
683         if (isDIGIT(*s))
684             seendigit = 1;      /* get this over with */
685
686         /* decimal digits */
687         while (isDIGIT(*s)) {
688             if (++offcount > PARTSIZE) {
689                 if (++ipart < PARTLIM) {
690                     part[ipart] = 0;
691                     offcount = 1;       /* ++0 */
692                 }
693                 else {
694                     /* limits of precision reached */
695                     --ipart;
696                     --offcount;
697                     if (*s >= '5')
698                         ++part[ipart];
699                     while (isDIGIT(*s))
700                         ++s;
701                     /* warn of loss of precision? */
702                     break;
703                 }
704             }
705             --expextra;
706             part[ipart] = part[ipart] * 10 + (*s++ - '0');
707         }
708     }
709
710     /* combine components of mantissa */
711     for (i = 0; i <= ipart; ++i)
712         result += S_mulexp10((NV)part[ipart - i],
713                 i ? offcount + (i - 1) * PARTSIZE : 0);
714
715     if (seendigit && (*s == 'e' || *s == 'E')) {
716         bool expnegative = 0;
717
718         ++s;
719         switch (*s) {
720             case '-':
721                 expnegative = 1;
722                 /* fall through */
723             case '+':
724                 ++s;
725         }
726         while (isDIGIT(*s))
727             exponent = exponent * 10 + (*s++ - '0');
728         if (expnegative)
729             exponent = -exponent;
730     }
731
732     /* now apply the exponent */
733     exponent += expextra;
734     result = S_mulexp10(result, exponent);
735
736     /* now apply the sign */
737     if (negative)
738         result = -result;
739     *value = result;
740     return s;
741 }
742