Mercurial > hg > CbC > CbC_gcc
view libphobos/libdruntime/core/math.d @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
line wrap: on
line source
// Written in the D programming language. /** * Builtin mathematical intrinsics * * Source: $(DRUNTIMESRC core/_math.d) * Macros: * TABLE_SV = <table border="1" cellpadding="4" cellspacing="0"> * <caption>Special Values</caption> * $0</table> * * NAN = $(RED NAN) * SUP = <span style="vertical-align:super;font-size:smaller">$0</span> * POWER = $1<sup>$2</sup> * PLUSMN = ± * INFIN = ∞ * PLUSMNINF = ±∞ * LT = < * GT = > * * Copyright: Copyright Digital Mars 2000 - 2011. * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). * Authors: $(WEB digitalmars.com, Walter Bright), * Don Clugston */ module core.math; public: @nogc: /*********************************** * Returns cosine of x. x is in radians. * * $(TABLE_SV * $(TR $(TH x) $(TH cos(x)) $(TH invalid?)) * $(TR $(TD $(NAN)) $(TD $(NAN)) $(TD yes) ) * $(TR $(TD $(PLUSMN)$(INFIN)) $(TD $(NAN)) $(TD yes) ) * ) * Bugs: * Results are undefined if |x| >= $(POWER 2,64). */ real cos(real x) @safe pure nothrow; /* intrinsic */ /*********************************** * Returns sine of x. x is in radians. * * $(TABLE_SV * $(TR $(TH x) $(TH sin(x)) $(TH invalid?)) * $(TR $(TD $(NAN)) $(TD $(NAN)) $(TD yes)) * $(TR $(TD $(PLUSMN)0.0) $(TD $(PLUSMN)0.0) $(TD no)) * $(TR $(TD $(PLUSMNINF)) $(TD $(NAN)) $(TD yes)) * ) * Bugs: * Results are undefined if |x| >= $(POWER 2,64). */ real sin(real x) @safe pure nothrow; /* intrinsic */ /***************************************** * Returns x rounded to a long value using the current rounding mode. * If the integer value of x is * greater than long.max, the result is * indeterminate. */ long rndtol(real x) @safe pure nothrow; /* intrinsic */ /***************************************** * Returns x rounded to a long value using the FE_TONEAREST rounding mode. * If the integer value of x is * greater than long.max, the result is * indeterminate. */ extern (C) real rndtonl(real x); /*************************************** * Compute square root of x. * * $(TABLE_SV * $(TR $(TH x) $(TH sqrt(x)) $(TH invalid?)) * $(TR $(TD -0.0) $(TD -0.0) $(TD no)) * $(TR $(TD $(LT)0.0) $(TD $(NAN)) $(TD yes)) * $(TR $(TD +$(INFIN)) $(TD +$(INFIN)) $(TD no)) * ) */ @safe pure nothrow { float sqrt(float x); /* intrinsic */ double sqrt(double x); /* intrinsic */ /// ditto real sqrt(real x); /* intrinsic */ /// ditto } /******************************************* * Compute n * 2$(SUPERSCRIPT exp) * References: frexp */ real ldexp(real n, int exp) @safe pure nothrow; /* intrinsic */ unittest { static if (real.mant_dig == 113) { assert(ldexp(1, -16384) == 0x1p-16384L); assert(ldexp(1, -16382) == 0x1p-16382L); } else static if (real.mant_dig == 106) { assert(ldexp(1, 1023) == 0x1p1023L); assert(ldexp(1, -1022) == 0x1p-1022L); assert(ldexp(1, -1021) == 0x1p-1021L); } else static if (real.mant_dig == 64) { assert(ldexp(1, -16384) == 0x1p-16384L); assert(ldexp(1, -16382) == 0x1p-16382L); } else static if (real.mant_dig == 53) { assert(ldexp(1, 1023) == 0x1p1023L); assert(ldexp(1, -1022) == 0x1p-1022L); assert(ldexp(1, -1021) == 0x1p-1021L); } else assert(false, "Only 128bit, 80bit and 64bit reals expected here"); } /******************************* * Returns |x| * * $(TABLE_SV * $(TR $(TH x) $(TH fabs(x))) * $(TR $(TD $(PLUSMN)0.0) $(TD +0.0) ) * $(TR $(TD $(PLUSMN)$(INFIN)) $(TD +$(INFIN)) ) * ) */ real fabs(real x) @safe pure nothrow; /* intrinsic */ /********************************** * Rounds x to the nearest integer value, using the current rounding * mode. * If the return value is not equal to x, the FE_INEXACT * exception is raised. * $(B nearbyint) performs * the same operation, but does not set the FE_INEXACT exception. */ real rint(real x) @safe pure nothrow; /* intrinsic */ /*********************************** * Building block functions, they * translate to a single x87 instruction. */ real yl2x(real x, real y) @safe pure nothrow; // y * log2(x) real yl2xp1(real x, real y) @safe pure nothrow; // y * log2(x + 1) unittest { version (INLINE_YL2X) { assert(yl2x(1024, 1) == 10); assert(yl2xp1(1023, 1) == 10); } }