Another Loco y ya on Sat, 19 Sep 2020 06:23:41 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Fortran compatibility |
Dear Bill, and friends here, have you ever seen it? this ( C? ) code: float InvSqrt (float x){ float xhalf = 0.5f*x; int i = *(int*)&x; i = 0x5f3759df - (i>>1); x = *(float*)&i; x = x*(1.5f - xhalf*x*x); return x; } At some point of history, it is supposed to have been used widely for calculating the 1 / sqrt(x). i still wonder how it works, and inspired by the FORTRAN question you just solved, i thought this would be worthy of some contemplation... perhaps later. (At least me) Not hurried. :-) Merci 2020-09-18 13:49 GMT-04:00, Bill Allombert <Bill.Allombert@math.u-bordeaux.fr>: > On Fri, Sep 18, 2020 at 04:39:47PM +0200, Bill Allombert wrote: >> PROGRAM prog >> use ISO_C_BINDING, only : C_PTR, C_DOUBLE >> use PARI >> implicit none >> real(kind=C_DOUBLE) :: r = 1e36 >> type(C_PTR) :: p >> CALL pari_init(10000000_8,2_8) >> p = gmul(gprec(dbltor(r),1000_8),glog(stoi(10000_8),20_8)) >> !p = gmod(p, Pi2n(1_8,20_8)) >> r = rtodbl(p) >> CALL pari_close() >> PRINT '(a,f0.9)','1e36*log(10000)%(2*Pi) = ', r >> END PROGRAM prog > > Sorry my mailer sent the wrong file, the correct version is > > PROGRAM prog > use ISO_C_BINDING, only : C_PTR, C_DOUBLE > use PARI > implicit none > real(kind=C_DOUBLE) :: r = 1e36 > type(C_PTR) :: p > integer(kind=C_LONG) :: prec = 20 ! 18 words > CALL pari_init(10000000_8,2_8) > p = glog(stoi(10000_8),prec) > p = gmod(p, Pi2n(1_8, prec)) > r = rtodbl(p) > CALL pari_close() > PRINT '(a,f0.9)','log(10000)%(2*Pi) = ', r > END PROGRAM prog > > Cheers, > Bill > >