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 }