On Sun, Feb 20, 2011 at 9:16 PM, Mark S. Miller <[email protected]> wrote: > The specification of Math.LOG10E says: > > 15.8.1.5 LOG10E > > The Number value for the base-10 logarithm of e, the base of the natural > logarithms; this value is approximately 0.4342944819032518. > > This property has the attributes { [[Writable]]: false, [[Enumerable]]: > false, [[Configurable]]: false }. > > NOTE The value of Math.LOG10E is approximately the reciprocal of the value > of Math.LN10. > > This is the only constant whose actual value differs across browsers: > > 0.43429448190325176 v8 version 2.3.9 [console: dumb] > 0.4342944819032518 Chrome 11.0.672.2 dev > 0.4342944819032518 Chrome 11.0.672.0 canary build > 0.4342944819032518 FF 3.6.13 > 0.4342944819032518 FF 4.0b12pre > 0.43429448190325176 Safari 5.0.1 (5533.17.8) > 0.43429448190325176 WebKit nightly Safari 5.0.1 (5533.17.8, r78794) > 0.4342944819032518 Opera 11.01 Build 1190 > 0.4342944819032518 IE 9.0.8080.16413CO > > Anyone know why? Which value is more correct? > I don't really care about Math.LOG10E, but it's easier to write tests if > only one value is actually correct. >
It makes sense to look at some number tables. $ grep 4342944 /usr/include/*.h /usr/include/lcms.h:# define LOGE 0.4342944819 /usr/include/math.h:# define M_LOG10E 0.43429448190325182765 /* log_10 e */ /usr/include/math.h:# define M_LOG10El 0.4342944819032518276511289189166051L /* log_10 e */ Thus it is necessary to test the difference between the internal and external representation. In my mind 0.43429448190325176 is less correct than 0.4342944819032518 but since the first correctly rounds to the second they are equal values underneath but not equal display strings. My guess is that the underlying value is correct but we are looking at rounding differences. I might note that 0.43429448190325182765 rounded to 17 sdp does not round to 0.43429448190325176 so is less 'correct'. It can also be interesting to report the processor being used when math details are being inspected. For example Intel has dedicated 80 bit registers in their FPU and in some cases only rounds when values are exported from FPU registers to 64 bit memory objects. Also it is important to know if the browser is a 32 bit or a 64 bit version as well as the underlying OS. And also the underlying math library as used in the link line, compiler and compiler flags. This link might be interesting if it did not mix php and js. http://phpjs.org/functions/get_defined_constants:839 In an ideal world browsers should use the system math lib. Yet there is always some code that #defines PI 3.1415 and reports bugs when the result differs in the 19th value to the right of the decimal. And if someone was 'clever' and built all of base 10 on something else like: "To get log base 10 we can define the function log10(x):= log(x)/log(10) = 0.43429448190325* log(x)" from http://www1.uprh.edu/rbaretti/MaximaPrimer2feb2011.htm other rounding issues would surface and "approximatively" as indicated in the standard quoted would apply. And since one of the recent assaults on php involved math this area is worthy of testing both for correctness as well as robustness. > -- > Cheers, > --MarkM > > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss > > -- T o m M i t c h e l l mitch-at-niftyegg-dot-com "My lifetime goal is to be the kind of person my dogs think I am." _______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

