summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/javascriptcore/JavaScriptCore/wtf
diff options
context:
space:
mode:
authorKent Hansen <kent.hansen@nokia.com>2010-04-07 16:12:45 (GMT)
committerKent Hansen <kent.hansen@nokia.com>2010-04-07 16:55:17 (GMT)
commit64f5b0cfdcbeacb4fe0aaf03810efa7572c858cc (patch)
tree8bfce891075f6631eab4a611e0f59e930100e2d3 /src/3rdparty/javascriptcore/JavaScriptCore/wtf
parent473dfcdf47372860f6d70264755050a7a1bbd493 (diff)
downloadQt-64f5b0cfdcbeacb4fe0aaf03810efa7572c858cc.zip
Qt-64f5b0cfdcbeacb4fe0aaf03810efa7572c858cc.tar.gz
Qt-64f5b0cfdcbeacb4fe0aaf03810efa7572c858cc.tar.bz2
Updated JavaScriptCore from /home/khansen/dev/qtwebkit-qtscript-integration to javascriptcore-snapshot-07042010 ( da4f912a2f648d518628e1066dace894d1da7081 )
[Windows] Fix a bug of round() with huge integral numbers https://bugs.webkit.org/show_bug.cgi?id=34297
Diffstat (limited to 'src/3rdparty/javascriptcore/JavaScriptCore/wtf')
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wtf/MathExtras.h25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/MathExtras.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/MathExtras.h
index 9ea57fd..a18949e 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/MathExtras.h
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/MathExtras.h
@@ -98,12 +98,25 @@ inline bool signbit(double x) { struct ieee_double *p = (struct ieee_double *)&x
#if COMPILER(MSVC) || COMPILER(RVCT)
-inline long long llround(double num) { return static_cast<long long>(num > 0 ? num + 0.5 : ceil(num - 0.5)); }
-inline long long llroundf(float num) { return static_cast<long long>(num > 0 ? num + 0.5f : ceil(num - 0.5f)); }
-inline long lround(double num) { return static_cast<long>(num > 0 ? num + 0.5 : ceil(num - 0.5)); }
-inline long lroundf(float num) { return static_cast<long>(num > 0 ? num + 0.5f : ceilf(num - 0.5f)); }
-inline double round(double num) { return num > 0 ? floor(num + 0.5) : ceil(num - 0.5); }
-inline float roundf(float num) { return num > 0 ? floorf(num + 0.5f) : ceilf(num - 0.5f); }
+// We must not do 'num + 0.5' or 'num - 0.5' because they can cause precision loss.
+static double round(double num)
+{
+ double integer = ceil(num);
+ if (num > 0)
+ return integer - num > 0.5 ? integer - 1.0 : integer;
+ return integer - num >= 0.5 ? integer - 1.0 : integer;
+}
+static float roundf(float num)
+{
+ float integer = ceilf(num);
+ if (num > 0)
+ return integer - num > 0.5f ? integer - 1.0f : integer;
+ return integer - num >= 0.5f ? integer - 1.0f : integer;
+}
+inline long long llround(double num) { return static_cast<long long>(round(num)); }
+inline long long llroundf(float num) { return static_cast<long long>(roundf(num)); }
+inline long lround(double num) { return static_cast<long>(round(num)); }
+inline long lroundf(float num) { return static_cast<long>(roundf(num)); }
inline double trunc(double num) { return num > 0 ? floor(num) : ceil(num); }
#endif