18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef WTF_MathExtras_h 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WTF_MathExtras_h 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <algorithm> 308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include <cmath> 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <float.h> 322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <limits> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdlib.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 35d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(SOLARIS) 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <ieeefp.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 39d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(OPENBSD) 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <sys/types.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <machine/ieee.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if COMPILER(MSVC) 45d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE) 46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <stdlib.h> 47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <limits> 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef M_PI 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst double piDouble = 3.14159265358979323846; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst float piFloat = 3.14159265358979323846f; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst double piDouble = M_PI; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst float piFloat = static_cast<float>(M_PI); 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 59967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#ifndef M_PI_2 60967717af5423377c967781471ee106e2bb4e11c8Ben Murdochconst double piOverTwoDouble = 1.57079632679489661923; 61967717af5423377c967781471ee106e2bb4e11c8Ben Murdochconst float piOverTwoFloat = 1.57079632679489661923f; 62967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#else 63967717af5423377c967781471ee106e2bb4e11c8Ben Murdochconst double piOverTwoDouble = M_PI_2; 64967717af5423377c967781471ee106e2bb4e11c8Ben Murdochconst float piOverTwoFloat = static_cast<float>(M_PI_2); 65967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif 66967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef M_PI_4 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst double piOverFourDouble = 0.785398163397448309616; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst float piOverFourFloat = 0.785398163397448309616f; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst double piOverFourDouble = M_PI_4; 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst float piOverFourFloat = static_cast<float>(M_PI_4); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 75d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(DARWIN) 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Work around a bug in the Mac OS X libc where ceil(-0.1) return +0. 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double wtf_ceil(double x) { return copysign(ceil(x), x); } 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ceil(x) wtf_ceil(x) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 84d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(SOLARIS) 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef isfinite 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline bool isfinite(double x) { return finite(x) && !isnand(x); } 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef isinf 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline bool isinf(double x) { return !finite(x) && !isnand(x); } 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef signbit 932bde8e466a4451c7319e3a072d118917957d6554Steve Blockinline bool signbit(double x) { return copysign(1.0, x) < 0; } 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 98d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(OPENBSD) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef isfinite 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline bool isfinite(double x) { return finite(x); } 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef signbit 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline bool signbit(double x) { struct ieee_double *p = (struct ieee_double *)&x; return p->dbl_sign; } 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1092bde8e466a4451c7319e3a072d118917957d6554Steve Block#if COMPILER(MSVC) || (COMPILER(RVCT) && !(RVCT_VERSION_AT_LEAST(3, 0, 0, 0))) 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 111d0825bca7fe65beaee391d30da42e937db621564Steve Block// We must not do 'num + 0.5' or 'num - 0.5' because they can cause precision loss. 112d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic double round(double num) 113d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 114d0825bca7fe65beaee391d30da42e937db621564Steve Block double integer = ceil(num); 115d0825bca7fe65beaee391d30da42e937db621564Steve Block if (num > 0) 116d0825bca7fe65beaee391d30da42e937db621564Steve Block return integer - num > 0.5 ? integer - 1.0 : integer; 117d0825bca7fe65beaee391d30da42e937db621564Steve Block return integer - num >= 0.5 ? integer - 1.0 : integer; 118d0825bca7fe65beaee391d30da42e937db621564Steve Block} 119d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic float roundf(float num) 120d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 121d0825bca7fe65beaee391d30da42e937db621564Steve Block float integer = ceilf(num); 122d0825bca7fe65beaee391d30da42e937db621564Steve Block if (num > 0) 123d0825bca7fe65beaee391d30da42e937db621564Steve Block return integer - num > 0.5f ? integer - 1.0f : integer; 124d0825bca7fe65beaee391d30da42e937db621564Steve Block return integer - num >= 0.5f ? integer - 1.0f : integer; 125d0825bca7fe65beaee391d30da42e937db621564Steve Block} 126d0825bca7fe65beaee391d30da42e937db621564Steve Blockinline long long llround(double num) { return static_cast<long long>(round(num)); } 127d0825bca7fe65beaee391d30da42e937db621564Steve Blockinline long long llroundf(float num) { return static_cast<long long>(roundf(num)); } 128d0825bca7fe65beaee391d30da42e937db621564Steve Blockinline long lround(double num) { return static_cast<long>(round(num)); } 129d0825bca7fe65beaee391d30da42e937db621564Steve Blockinline long lroundf(float num) { return static_cast<long>(roundf(num)); } 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double trunc(double num) { return num > 0 ? floor(num) : ceil(num); } 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if COMPILER(MSVC) 13521939df44de1705786c545cd1bf519d47250322dBen Murdoch// The 64bit version of abs() is already defined in stdlib.h which comes with VC10 13621939df44de1705786c545cd1bf519d47250322dBen Murdoch#if COMPILER(MSVC9_OR_LOWER) 137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockinline long long abs(long long num) { return _abs64(num); } 13821939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectinline bool isinf(double num) { return !_finite(num) && !_isnan(num); } 141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectinline bool isnan(double num) { return !!_isnan(num); } 142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectinline bool signbit(double num) { return _copysign(1.0, num) < 0; } 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double nextafter(double x, double y) { return _nextafter(x, y); } 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline float nextafterf(float x, float y) { return x > y ? x - FLT_EPSILON : x + FLT_EPSILON; } 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double copysign(double x, double y) { return _copysign(x, y); } 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline int isfinite(double x) { return _finite(x); } 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// MSVC's math.h does not currently supply log2. 151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline double log2(double num) 152f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 153f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // This constant is roughly M_LN2, which is not provided by default on Windows. 154f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return log(num) / 0.693147180559945309417232121458176568; 155f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Work around a bug in Win, where atan2(+-infinity, +-infinity) yields NaN instead of specific values. 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double wtf_atan2(double x, double y) 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double posInf = std::numeric_limits<double>::infinity(); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double negInf = -std::numeric_limits<double>::infinity(); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double nan = std::numeric_limits<double>::quiet_NaN(); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double result = nan; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (x == posInf && y == posInf) 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = piOverFourDouble; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (x == posInf && y == negInf) 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = 3 * piOverFourDouble; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (x == negInf && y == posInf) 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = -piOverFourDouble; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (x == negInf && y == negInf) 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = -3 * piOverFourDouble; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ::atan2(x, y); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Work around a bug in the Microsoft CRT, where fmod(x, +-infinity) yields NaN instead of x. 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double wtf_fmod(double x, double y) { return (!isinf(x) && isinf(y)) ? x : fmod(x, y); } 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Work around a bug in the Microsoft CRT, where pow(NaN, 0) yields NaN instead of 1. 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double wtf_pow(double x, double y) { return y == 0 ? 1 : pow(x, y); } 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define atan2(x, y) wtf_atan2(x, y) 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define fmod(x, y) wtf_fmod(x, y) 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define pow(x, y) wtf_pow(x, y) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // COMPILER(MSVC) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double deg2rad(double d) { return d * piDouble / 180.0; } 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double rad2deg(double r) { return r * 180.0 / piDouble; } 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double deg2grad(double d) { return d * 400.0 / 360.0; } 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double grad2deg(double g) { return g * 360.0 / 400.0; } 196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectinline double turn2deg(double t) { return t * 360.0; } 197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectinline double deg2turn(double d) { return d / 360.0; } 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double rad2grad(double r) { return r * 200.0 / piDouble; } 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline double grad2rad(double g) { return g * piDouble / 200.0; } 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline float deg2rad(float d) { return d * piFloat / 180.0f; } 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline float rad2deg(float r) { return r * 180.0f / piFloat; } 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline float deg2grad(float d) { return d * 400.0f / 360.0f; } 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline float grad2deg(float g) { return g * 360.0f / 400.0f; } 205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectinline float turn2deg(float t) { return t * 360.0f; } 206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectinline float deg2turn(float d) { return d / 360.0f; } 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline float rad2grad(float r) { return r * 200.0f / piFloat; } 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline float grad2rad(float g) { return g * piFloat / 200.0f; } 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2102fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline int clampToInteger(double d) 2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 2122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const double minIntAsDouble = std::numeric_limits<int>::min(); 2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const double maxIntAsDouble = std::numeric_limits<int>::max(); 2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return static_cast<int>(std::max(std::min(d, maxIntAsDouble), minIntAsDouble)); 2152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline int clampToPositiveInteger(double d) 2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const double maxIntAsDouble = std::numeric_limits<int>::max(); 2202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return static_cast<int>(std::max<double>(std::min(d, maxIntAsDouble), 0)); 2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 223d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdochinline int clampToInteger(float x) 2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 225d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch static const int s_intMax = std::numeric_limits<int>::max(); 226d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch static const int s_intMin = std::numeric_limits<int>::min(); 227d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch 228d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch if (x >= static_cast<float>(s_intMax)) 229d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch return s_intMax; 230d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch if (x < static_cast<float>(s_intMin)) 231d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch return s_intMin; 232d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch return static_cast<int>(x); 2332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 235d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdochinline int clampToPositiveInteger(float x) 2362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 237d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch static const int s_intMax = std::numeric_limits<int>::max(); 238d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch 239d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch if (x >= static_cast<float>(s_intMax)) 240d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch return s_intMax; 241d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch if (x < 0) 242d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch return 0; 243d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch return static_cast<int>(x); 2442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2462bde8e466a4451c7319e3a072d118917957d6554Steve Blockinline int clampToInteger(unsigned value) 2472bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 2482bde8e466a4451c7319e3a072d118917957d6554Steve Block return static_cast<int>(std::min(value, static_cast<unsigned>(std::numeric_limits<int>::max()))); 2492bde8e466a4451c7319e3a072d118917957d6554Steve Block} 2502bde8e466a4451c7319e3a072d118917957d6554Steve Block 2512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !COMPILER(MSVC) && !(COMPILER(RVCT) && PLATFORM(BREWMP)) && !OS(SOLARIS) && !OS(SYMBIAN) 2528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockusing std::isfinite; 2538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockusing std::isinf; 2548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockusing std::isnan; 2558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockusing std::signbit; 2568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif 2578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // #ifndef WTF_MathExtras_h 259