Jonas Hahnfeld <hah...@hahnjo.de> writes: > 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
Halving the useful range before overflows is a problem, so I'll stick with most of the guards. Though I am skeptical that stuff exceeding I64 has much of a chance of working well, anyway. -- David Kastrup