Am Dienstag, den 04.02.2020, 16:57 +0100 schrieb David Kastrup: > Dan Eble < > d...@faithful.be > > writes: > > > On Feb 4, 2020, at 09:44, Masamichi Hosoda < > > truer...@trueroad.jp > > > wrote: > > > +// FIXME: workaround: In GUB, g++ 4.9.4 for darwin-x86, > > > +// it seems that static cast from `unsigned long long` to `double` > > > +// by x86 SSE2 raises an internal compile error. > > > +// However, static cast from `signed long long` to `double` > > > +// does not raise the error. > > > +// So we use it for a workaround. > > > +#if defined (__i386__) && defined (__APPLE__) && \ > > > + defined (__SSE2_MATH__) && __GNUC__ < 5 > > > + { > > > + I64 inum = num_; > > > + I64 iden = den_; > > > + return static_cast<double> (sign_) * > > > + static_cast<double> (inum) / static_cast<double> (iden); > > > + } > > > +#else > > > return (double)sign_ * (double)num_ / (double)den_; > > > +#endif > > > > Is the conditional code really necessary? Why not boil it down to the > > working code and a comment explaining the extra conversion to signed > > numbers? > > That would be my impulse as well. It is not like this code appears to > have notable drawbacks for the unafflicted platforms.
Except for very funny overflows and negative signs if the value is too large to fit into I64 ;-P unsigned long long a = 0xC0000000; signed long long b = a; printf("%d\n", b); -> -1073741824 Jonas
signature.asc
Description: This is a digitally signed message part