Mercurial > hg > CbC > CbC_gcc
comparison libquadmath/math/llroundq.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | 561a7518be6b |
children | 1830386684a0 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* Round long double value to long long int. | 1 /* Round __float128 value to long long int. |
2 Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. | 2 Copyright (C) 1997-2017 Free Software Foundation, Inc. |
3 This file is part of the GNU C Library. | 3 This file is part of the GNU C Library. |
4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and | 4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and |
5 Jakub Jelinek <jj@ultra.linux.cz>, 1999. | 5 Jakub Jelinek <jj@ultra.linux.cz>, 1999. |
6 | 6 |
7 The GNU C Library is free software; you can redistribute it and/or | 7 The GNU C Library is free software; you can redistribute it and/or |
8 modify it under the terms of the GNU Lesser General Public | 8 modify it under the terms of the GNU Lesser General Public |
9 License as published by the Free Software Foundation; either | 9 License as published by the Free Software Foundation; either |
10 version 2.1 of the License, or (at your option) any later version. | 10 version 2.1 of the License, or (at your option) any later version. |
57 ++i0; | 57 ++i0; |
58 | 58 |
59 if (j0 == 48) | 59 if (j0 == 48) |
60 result = (long long int) i0; | 60 result = (long long int) i0; |
61 else | 61 else |
62 result = ((long long int) i0 << (j0 - 48)) | (j >> (112 - j0)); | 62 { |
63 result = ((long long int) i0 << (j0 - 48)) | (j >> (112 - j0)); | |
64 #if defined FE_INVALID && defined USE_FENV_H | |
65 if (sign == 1 && result == LLONG_MIN) | |
66 /* Rounding brought the value out of range. */ | |
67 feraiseexcept (FE_INVALID); | |
68 #endif | |
69 } | |
63 } | 70 } |
64 } | 71 } |
65 else | 72 else |
66 { | 73 { |
67 /* The number is too large. It is left implementation defined | 74 /* The number is too large. Unless it rounds to LLONG_MIN, |
68 what happens. */ | 75 FE_INVALID must be raised and the return value is |
76 unspecified. */ | |
77 #ifdef FE_INVALID | |
78 if (x <= (__float128) LLONG_MIN - 0.5Q) | |
79 { | |
80 /* If truncation produces LLONG_MIN, the cast will not raise | |
81 the exception, but may raise "inexact". */ | |
82 #ifdef USE_FENV_H | |
83 feraiseexcept (FE_INVALID); | |
84 #endif | |
85 return LLONG_MIN; | |
86 } | |
87 #endif | |
69 return (long long int) x; | 88 return (long long int) x; |
70 } | 89 } |
71 | 90 |
72 return sign * result; | 91 return sign * result; |
73 } | 92 } |