Here is an example of my usage of long double, in this case the functions
have a double precision interface, but the functions not directly available
in double use long double internally:
field rng(const field& x,const field& y){
long double a = longdoublify(x);
long double b = longdoublify(y);
long double const m = powl(2,-64);
return (double)(next()*m*(b-a)+a);
}
const long double tau = 6.283185307179586477l;
field funct(const field& x,const field& y){
u16abstract a = stringify(x);
double b = doublify(y);
do{
if(a==sk("abs" )) {b=fabs(b);break;}
if(a==sk("sqrt")) {b=sqrt(b);break;}
if(a==sk("sin" )) {b=sinl(b*(tau/360.l));break;}
if(a==sk("cos" )) {b=cosl(b*(tau/360.l));break;}
if(a==sk("tan" )) {b=tanl(b*(tau/360.l));break;}
if(a==sk("asin")) {b=asinl(b)*(360.l/tau);break;}
if(a==sk("acos")) {b=acosl(b)*(360.l/tau);break;}
if(a==sk("atan")) {b=atanl(b)*(360.l/tau);break;}
if(a==sk("ln" )) {b=log(b);break;}
if(a==sk("log" )) {b=log10(b);break;}
if(a==sk("e ^" )) {b=exp(b);break;}
if(a==sk("10 ^")) {b=pow(10,b);break;}
}while(0);
return b;
}
So, for example, on a 32-bit ARM computer, where long double is double
precision, sinl(b*(tau/360.l)) is equivalent to
sin(b*(6.283185307179586/360)), whereas on Windows with Digital Mars,
extended precision will be used. The intent is that the intermediate
computations are native. With x87, extended precision is typically more
native than double precision, so it makes sense to use long double as the
native type, however, when long double is unnative, internal computations
can slow down the program functions.
On Friday, November 4, 2022 at 10:09:10 PM UTC+1 [email protected] wrote:
> Can I ask what type of thing you are using `long double` for? We
> haven't seen muck codebases that use (mostly just printf when it wants to
> print one). If you are expecting it to be the same as `double` why not
> just use `double`?
>
>
>
> On Fri, Nov 4, 2022 at 12:20 PM Piotr Grochowski <[email protected]>
> wrote:
>
>>
>> sizeof(long double)
>> 16
>> LDBL_MANT_DIG
>> 113
>>
>> This completely throws me off since I use long double in my code
>> expecting it to be native (for example, on Digital Mars on Windows,
>> sizeof(long double) is 10, and LDBL_MANT_DIG is 64). And quadruple
>> precision is not native in many computers. This certainly should be warned
>> about in
>> https://emscripten.org/docs/porting/guidelines/portability_guidelines.html#code-that-compiles-but-might-run-slowly
>>
>> . So how do I get long double to be double precision instead (sizeof(long
>> double) being 8, and LDBL_MANT_DIG being 53)?
>>
>> --
>>
> You received this message because you are subscribed to the Google Groups
>> "emscripten-discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/emscripten-discuss/23b05bb2-1164-4885-9eb4-cacd7d337f3dn%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/emscripten-discuss/23b05bb2-1164-4885-9eb4-cacd7d337f3dn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
--
You received this message because you are subscribed to the Google Groups
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/emscripten-discuss/1b5ee145-2700-4ec2-b8db-953dcd40bd5dn%40googlegroups.com.