2020-01-10 01:10:09 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
< html >
< head >
2020-04-14 19:56:54 +03:00
< title > Mathematics Template< / title >
2020-03-19 02:11:25 +02:00
< meta name = "viewport" content = "width=device-width initial-scale=1" >
2020-01-10 01:10:09 +02:00
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
< meta http-equiv = "Content-Language" content = "en-gb" >
2020-03-19 02:11:25 +02:00
< link href = "../inweb.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2020-04-14 19:56:54 +03:00
2020-01-10 01:10:09 +02:00
< / head >
< body >
2020-03-19 02:11:25 +02:00
< nav role = "navigation" >
2020-04-14 19:56:54 +03:00
< h1 > < a href = "../index.html" >
< img src = "../docs-src/Figures/Inform.png" height = 72" >
< / a > < / h1 >
< ul > < li > < a href = "../compiler.html" > compiler tools< / a > < / li >
2020-03-19 02:11:25 +02:00
< li > < a href = "../other.html" > other tools< / a > < / li >
2020-04-14 19:56:54 +03:00
< li > < a href = "../extensions.html" > extensions and kits< / a > < / li >
2020-03-19 02:11:25 +02:00
< li > < a href = "../units.html" > unit test tools< / a > < / li >
2020-04-14 19:56:54 +03:00
< / ul > < h2 > Extensions< / h2 > < ul >
< li > < a href = "../basic_inform/index.html" > basic_inform< / a > < / li >
< li > < a href = "../standard_rules/index.html" > standard_rules< / a > < / li >
< / ul > < h2 > Kits< / h2 > < ul >
< li > < a href = "index.html" > < span class = "selectedlink" > BasicInformKit< / span > < / a > < / li >
2020-03-19 02:11:25 +02:00
< li > < a href = "../BasicInformExtrasKit/index.html" > BasicInformExtrasKit< / a > < / li >
< li > < a href = "../CommandParserKit/index.html" > CommandParserKit< / a > < / li >
< li > < a href = "../EnglishLanguageKit/index.html" > EnglishLanguageKit< / a > < / li >
< li > < a href = "../WorldModelKit/index.html" > WorldModelKit< / a > < / li >
2020-04-14 19:56:54 +03:00
< / ul >
2020-03-19 02:11:25 +02:00
< / nav >
< main role = "main" >
2020-04-14 19:56:54 +03:00
<!-- Weave of 'Mathematics Template' generated by 7 -->
< ul class = "crumbs" > < li > < a href = "../index.html" > Home< / a > < / li > < li > < a href = "../extensions.html" > Kits< / a > < / li > < li > < a href = "index.html" > BasicInformKit< / a > < / li > < li > < b > Mathematics Template< / b > < / li > < / ul > < p class = "purpose" > Mathematical functions, especially for real numbers.< / p >
2020-01-10 01:10:09 +02:00
< ul class = "toc" > < li > < a href = "#SP1" > § 1. Square Root< / a > < / li > < li > < a href = "#SP2" > § 2. Cube Root< / a > < / li > < li > < a href = "#SP3" > § 3. Absolute value< / a > < / li > < li > < a href = "#SP4" > § 4. IntegerDivide< / a > < / li > < li > < a href = "#SP5" > § 5. IntegerRemainder< / a > < / li > < li > < a href = "#SP6" > § 6. UnsignedCompare< / a > < / li > < li > < a href = "#SP7" > § 7. SignedCompare< / a > < / li > < li > < a href = "#SP8" > § 8. Printing reals< / a > < / li > < / ul > < hr class = "tocbar" >
< p class = "inwebparagraph" > < a id = "SP1" > < / a > < b > § 1. Square Root. < / b > Although this routine performs integer square root, it does so using Glulx's
floating-point operations if available (with code contributed by Andrew
Plotkin): this is fast and remains accurate up to about 16 million.
< / p >
< p class = "inwebparagraph" > The slower integer method is an old algorithm for extracting binary square
roots, taking 2 bits at a time. We start out with < code class = "display" > < span class = "extract" > one< / span > < / code > at the highest bit
which isn't the sign bit; that used to be worked out as < code class = "display" > < span class = "extract" > WORD_HIGHBIT/2< / span > < / code > , but
this caused unexpected portability problems (exposing a minor bug in Inform
and also glulxe) because of differences in how C compilers handle signed
2020-04-14 19:56:54 +03:00
division of constants in the case where the dividend is \(-2^{31}\), the unique
2020-01-10 01:10:09 +02:00
number which cannot be negated in 32-bit twos complement arithmetic.
< / p >
< pre class = "display" >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > SquareRoot< / span > < span class = "plain" > < / span > < span class = "identifier" > num< / span >
< span class = "identifier" > op< / span > < span class = "plain" > < / span > < span class = "identifier" > res< / span > < span class = "plain" > < / span > < span class = "identifier" > one< / span > < span class = "plain" > < / span > < span class = "identifier" > n< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > num< / span > < span class = "plain" > < < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) { < / span > < span class = "identifier" > RunTimeProblem< / span > < span class = "plain" > (< / span > < span class = "identifier" > RTP_NEGATIVEROOT< / span > < span class = "plain" > ); < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ; }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Use floating-point ops if available.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > ifdef< / span > < span class = "plain" > < / span > < span class = "identifier" > TARGET_GLULX< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > gestalt< / span > < span class = "plain" > < / span > < span class = "constant" > 11< / span > < span class = "plain" > < / span > < span class = "constant" > 0< / span > < span class = "plain" > < / span > < span class = "identifier" > n< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > n< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > num< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > sqrt< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > ftonumz< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > num< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > num< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-08 01:02:44 +03:00
< span class = "plain" > #< / span > < span class = "identifier" > endif< / span > < span class = "plain" > ;< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > op< / span > < span class = "plain" > = < / span > < span class = "identifier" > num< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > num< / span > < span class = "plain" > < < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) { < / span > < span class = "identifier" > RunTimeProblem< / span > < span class = "plain" > (< / span > < span class = "identifier" > RTP_NEGATIVEROOT< / span > < span class = "plain" > ); < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ; }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > "one" starts at the highest power of four < = the argument.< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "identifier" > one< / span > < span class = "plain" > = < / span > < span class = "identifier" > WORD_NEXTTOHIGHBIT< / span > < span class = "plain" > : < / span > < span class = "identifier" > one< / span > < span class = "plain" > > < / span > < span class = "identifier" > op< / span > < span class = "plain" > : < / span > < span class = "identifier" > one< / span > < span class = "plain" > = < / span > < span class = "identifier" > one< / span > < span class = "plain" > /4) ;< / span >
< span class = "reserved" > while< / span > < span class = "plain" > (< / span > < span class = "identifier" > one< / span > < span class = "plain" > ~= < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) {< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > print "Round: op = ", op, " res = ", res, ", res**2 = ", res*res, " one = ", one, " nthb = ", WORD_NEXTTOHIGHBIT, "^";< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > op< / span > < span class = "plain" > > = < / span > < span class = "identifier" > res< / span > < span class = "plain" > + < / span > < span class = "identifier" > one< / span > < span class = "plain" > ) {< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > op< / span > < span class = "plain" > = < / span > < span class = "identifier" > op< / span > < span class = "plain" > - < / span > < span class = "identifier" > res< / span > < span class = "plain" > - < / span > < span class = "identifier" > one< / span > < span class = "plain" > ;< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > res< / span > < span class = "plain" > = < / span > < span class = "identifier" > res< / span > < span class = "plain" > /2 + < / span > < span class = "identifier" > one< / span > < span class = "plain" > ;< / span >
< span class = "plain" > } < / span > < span class = "reserved" > else< / span > < span class = "plain" > {< / span >
< span class = "identifier" > res< / span > < span class = "plain" > = < / span > < span class = "identifier" > res< / span > < span class = "plain" > /2;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > one< / span > < span class = "plain" > = < / span > < span class = "identifier" > one< / span > < span class = "plain" > /4;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > print "Res is ", res, "^";< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > res< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP2" > < / a > < b > § 2. Cube Root. < / b > The following, again, uses floating-point arithmetic if it's available:
this is fast and gives good accuracy for smallish numbers, but limited
precision begins to tell at around 2000000.
< / p >
< p class = "inwebparagraph" > The alternative is an iterative scheme for finding cube roots by
Newton-Raphson approximation, not a great method but which, on the narrow
ranges of integers we deal with, just about good enough. The square root is
used only as a sighting shot.
< / p >
< pre class = "display" >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > CubeRoot< / span > < span class = "plain" > < / span > < span class = "identifier" > num< / span > < span class = "plain" > < / span > < span class = "identifier" > neg< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > n< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Use floating-point ops if available.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > ifdef< / span > < span class = "plain" > < / span > < span class = "identifier" > TARGET_GLULX< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > gestalt< / span > < span class = "plain" > < / span > < span class = "constant" > 11< / span > < span class = "plain" > < / span > < span class = "constant" > 0< / span > < span class = "plain" > < / span > < span class = "identifier" > n< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > n< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > num< / span > < span class = "plain" > < < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > neg< / span > < span class = "plain" > = < / span > < span class = "reserved" > true< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > num< / span > < span class = "plain" > = -< / span > < span class = "identifier" > num< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > num< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "plain" > @< / span > < span class = "identifier" > pow< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "constant" > 1051372203< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ; < / span > < span class = "comment" > pow(x, 0.3333)< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > ftonumz< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > num< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > neg< / span > < span class = "plain" > )< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > return< / span > < span class = "plain" > -< / span > < span class = "identifier" > num< / span > < span class = "plain" > ;< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > else< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > num< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > endif< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > num< / span > < span class = "plain" > < < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) < / span > < span class = "identifier" > x< / span > < span class = "plain" > = -< / span > < span class = "identifier" > SquareRoot< / span > < span class = "plain" > (-< / span > < span class = "identifier" > num< / span > < span class = "plain" > ); < / span > < span class = "reserved" > else< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > = < / span > < span class = "identifier" > SquareRoot< / span > < span class = "plain" > (< / span > < span class = "identifier" > num< / span > < span class = "plain" > );< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "identifier" > n< / span > < span class = "plain" > =0: (< / span > < span class = "identifier" > y< / span > < span class = "plain" > ~= < / span > < span class = "identifier" > x< / span > < span class = "plain" > ) & & (< / span > < span class = "identifier" > n< / span > < span class = "plain" > ++ < < / span > < span class = "constant" > 100< / span > < span class = "plain" > ): < / span > < span class = "identifier" > y< / span > < span class = "plain" > = < / span > < span class = "identifier" > x< / span > < span class = "plain" > , < / span > < span class = "identifier" > x< / span > < span class = "plain" > = (2*< / span > < span class = "identifier" > x< / span > < span class = "plain" > + < / span > < span class = "identifier" > num< / span > < span class = "plain" > /< / span > < span class = "identifier" > x< / span > < span class = "plain" > /< / span > < span class = "identifier" > x< / span > < span class = "plain" > )/3) ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP3" > < / a > < b > § 3. Absolute value. < / b > Of an integer:
< / p >
< pre class = "display" >
2020-04-07 03:06:09 +03:00
< span class = "plain" > [ < / span > < span class = "identifier" > NUMBER_TY_Abs< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ; < / span > < span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > x< / span > < span class = "plain" > < 0) < / span > < span class = "reserved" > return< / span > < span class = "plain" > -< / span > < span class = "identifier" > x< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ; ];< / span >
2020-01-10 01:10:09 +02:00
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP4" > < / a > < b > § 4. IntegerDivide. < / b > We can't simply use I6's < code class = "display" > < span class = "extract" > /< / span > < / code > operator, as that translates directly into a
virtual machine opcode which crashes on divide by zero.
< / p >
< pre class = "display" >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > IntegerDivide< / span > < span class = "plain" > < / span > < span class = "identifier" > A< / span > < span class = "plain" > < / span > < span class = "identifier" > B< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > B< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) { < / span > < span class = "identifier" > RunTimeProblem< / span > < span class = "plain" > (< / span > < span class = "identifier" > RTP_DIVZERO< / span > < span class = "plain" > ); < / span > < span class = "reserved" > rfalse< / span > < span class = "plain" > ; }< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > A< / span > < span class = "plain" > /< / span > < span class = "identifier" > B< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP5" > < / a > < b > § 5. IntegerRemainder. < / b > Similarly.
< / p >
< pre class = "display" >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > IntegerRemainder< / span > < span class = "plain" > < / span > < span class = "identifier" > A< / span > < span class = "plain" > < / span > < span class = "identifier" > B< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > B< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) { < / span > < span class = "identifier" > RunTimeProblem< / span > < span class = "plain" > (< / span > < span class = "identifier" > RTP_DIVZERO< / span > < span class = "plain" > ); < / span > < span class = "reserved" > rfalse< / span > < span class = "plain" > ; }< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > A< / span > < span class = "plain" > %< / span > < span class = "identifier" > B< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP6" > < / a > < b > § 6. UnsignedCompare. < / b > Comparison of I6 integers is normally signed, that is, treating the word as
a twos-complement signed number, so that < code class = "display" > < span class = "extract" > $FFFF< / span > < / code > is less than < code class = "display" > < span class = "extract" > 0< / span > < / code > , for
instance. If we want to construe words as being unsigned integers, or as
addresses, we need to compare them with the following routine, which returns
2020-04-14 19:56:54 +03:00
1 if \(x> y\), 0 if \(x=y\) and \(-1\) if \(x< y\).
2020-01-10 01:10:09 +02:00
< / p >
< pre class = "display" >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > UnsignedCompare< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > u< / span > < span class = "plain" > < / span > < span class = "identifier" > v< / span > < span class = "plain" > ;< / span >
< span class = "plain" > #< / span > < span class = "identifier" > Ifdef< / span > < span class = "plain" > < / span > < span class = "identifier" > TARGET_GLULX< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jleu< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > ?< / span > < span class = "identifier" > lesseq< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ;< / span >
< span class = "plain" > .< / span > < span class = "identifier" > lesseq< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jeq< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > ?< / span > < span class = "identifier" > equal< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > return< / span > < span class = "plain" > -1;< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > equal< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "plain" > #< / span > < span class = "identifier" > Ifnot< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > x< / span > < span class = "plain" > == < / span > < span class = "identifier" > y< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > x< / span > < span class = "plain" > < < / span > < span class = "constant" > 0< / span > < span class = "plain" > & & < / span > < span class = "identifier" > y< / span > < span class = "plain" > > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > x< / span > < span class = "plain" > > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > & & < / span > < span class = "identifier" > y< / span > < span class = "plain" > < < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > -1;< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > u< / span > < span class = "plain" > = < / span > < span class = "identifier" > x< / span > < span class = "plain" > & ~< / span > < span class = "identifier" > WORD_HIGHBIT< / span > < span class = "plain" > ; < / span > < span class = "identifier" > v< / span > < span class = "plain" > = < / span > < span class = "identifier" > y< / span > < span class = "plain" > & ~< / span > < span class = "identifier" > WORD_HIGHBIT< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > u< / span > < span class = "plain" > > < / span > < span class = "identifier" > v< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > return< / span > < span class = "plain" > -1;< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > Endif< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP7" > < / a > < b > § 7. SignedCompare. < / b > This routine is hardly ever needed; it wraps up ordinary comparisons.
< / p >
< pre class = "display" >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > SignedCompare< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > x< / span > < span class = "plain" > > < / span > < span class = "identifier" > y< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > x< / span > < span class = "plain" > == < / span > < span class = "identifier" > y< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > return< / span > < span class = "plain" > -1;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP8" > < / a > < b > § 8. Printing reals. < / b > Most of the code in this section is by Andrew Plotkin, and derives from test
cases used to check the floating-point extensions to Glulx.
< / p >
< pre class = "display" >
2020-01-12 02:35:36 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > Ifdef< / span > < span class = "plain" > < / span > < span class = "identifier" > TARGET_GLULX< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Say< / span > < span class = "plain" > < / span > < span class = "identifier" > fp< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > print< / span > < span class = "plain" > (< / span > < span class = "identifier" > Float< / span > < span class = "plain" > ) < / span > < span class = "identifier" > fp< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Compare< / span > < span class = "plain" > < / span > < span class = "identifier" > r1< / span > < span class = "plain" > < / span > < span class = "identifier" > r2< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jflt< / span > < span class = "plain" > < / span > < span class = "identifier" > r1< / span > < span class = "plain" > < / span > < span class = "identifier" > r2< / span > < span class = "plain" > ?< / span > < span class = "identifier" > less< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jfeq< / span > < span class = "plain" > < / span > < span class = "identifier" > r1< / span > < span class = "plain" > < / span > < span class = "identifier" > r2< / span > < span class = "plain" > < / span > < span class = "constant" > 0< / span > < span class = "plain" > ?< / span > < span class = "identifier" > same< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ;< / span >
< span class = "plain" > .< / span > < span class = "identifier" > same< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "plain" > .< / span > < span class = "identifier" > less< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > -1;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > NUMBER_TY_to_REAL_NUMBER_TY< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > real< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > real< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > real< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_to_NUMBER_TY< / span > < span class = "plain" > < / span > < span class = "identifier" > real< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > ftonumn< / span > < span class = "plain" > < / span > < span class = "identifier" > real< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Sin< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > sin< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Cos< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > cos< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Tan< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > tan< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Arcsin< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > asin< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Arccos< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > acos< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Arctan< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > atan< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Sinh< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > tmp< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > exp< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > tmp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fsub< / span > < span class = "plain" > < / span > < span class = "identifier" > M_0< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > exp< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fadd< / span > < span class = "plain" > < / span > < span class = "identifier" > tmp< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > < / span > < span class = "identifier" > M_HALF< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Cosh< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > tmp< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > exp< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > tmp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fsub< / span > < span class = "plain" > < / span > < span class = "identifier" > M_0< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > exp< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fsub< / span > < span class = "plain" > < / span > < span class = "identifier" > tmp< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > < / span > < span class = "identifier" > M_HALF< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Tanh< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > tmp< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > tmp< / span > < span class = "plain" > = < / span > < span class = "identifier" > REAL_NUMBER_TY_Sinh< / span > < span class = "plain" > (< / span > < span class = "reserved" > in< / span > < span class = "plain" > );< / span >
< span class = "reserved" > in< / span > < span class = "plain" > = < / span > < span class = "identifier" > REAL_NUMBER_TY_Cosh< / span > < span class = "plain" > (< / span > < span class = "reserved" > in< / span > < span class = "plain" > );< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > tmp< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Reciprocal< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > M_1< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Negate< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > fsub< / span > < span class = "plain" > < / span > < span class = "identifier" > M_0< / span > < span class = "plain" > < / span > < span class = "reserved" > in< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Plus< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > fadd< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Minus< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > fsub< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Times< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Divide< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Remainder< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > r< / span > < span class = "plain" > < / span > < span class = "identifier" > q< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > fmod< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > r< / span > < span class = "plain" > < / span > < span class = "identifier" > q< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > r< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Approximate< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > quotient< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > quotient< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fadd< / span > < span class = "plain" > < / span > < span class = "identifier" > quotient< / span > < span class = "plain" > < / span > < span class = "identifier" > M_HALF< / span > < span class = "plain" > < / span > < span class = "identifier" > quotient< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > floor< / span > < span class = "plain" > < / span > < span class = "identifier" > quotient< / span > < span class = "plain" > < / span > < span class = "identifier" > quotient< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > quotient< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Root< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > sqrt< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Cube_Root< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > pow< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > M_THIRD< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Pow< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > pow< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > y< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Exp< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > exp< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Log< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > log< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_BLog< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > n< / span > < span class = "plain" > < / span > < span class = "identifier" > d< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > log< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > n< / span > < span class = "plain" > == < / span > < span class = "constant" > 10< / span > < span class = "plain" > ) < / span > < span class = "identifier" > d< / span > < span class = "plain" > = < / span > < span class = "identifier" > M_LOG10< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > else< / span > < span class = "plain" > {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > n< / span > < span class = "plain" > < / span > < span class = "identifier" > d< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > log< / span > < span class = "plain" > < / span > < span class = "identifier" > d< / span > < span class = "plain" > < / span > < span class = "identifier" > d< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > < / span > < span class = "identifier" > d< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Floor< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > floor< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Ceiling< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > ceil< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > out< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Abs< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > & < / span > < span class = "constant" > $7fffffff< / span > < span class = "plain" > ; ];< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Nan< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ; @< / span > < span class = "identifier" > jisnan< / span > < span class = "plain" > < / span > < span class = "identifier" > x< / span > < span class = "plain" > ?< / span > < span class = "identifier" > Nan< / span > < span class = "plain" > ; < / span > < span class = "reserved" > rfalse< / span > < span class = "plain" > ; .< / span > < span class = "identifier" > Nan< / span > < span class = "plain" > ; < / span > < span class = "reserved" > rtrue< / span > < span class = "plain" > ; ];< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_0< / span > < span class = "plain" > = < / span > < span class = "constant" > $0< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_1< / span > < span class = "plain" > = < / span > < span class = "constant" > $3F800000< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_HALF< / span > < span class = "plain" > = < / span > < span class = "constant" > $3F000000< / span > < span class = "plain" > ; < / span > < span class = "comment" > 1/3< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_THIRD< / span > < span class = "plain" > = < / span > < span class = "constant" > $3EAAAAAB< / span > < span class = "plain" > ; < / span > < span class = "comment" > 1/3< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_LOG10< / span > < span class = "plain" > = < / span > < span class = "constant" > $40135D8E< / span > < span class = "plain" > ; < / span > < span class = "comment" > log(10)< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_N1< / span > < span class = "plain" > = < / span > < span class = "constant" > $BF800000< / span > < span class = "plain" > ; < / span > < span class = "comment" > -1< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_PI< / span > < span class = "plain" > = < / span > < span class = "constant" > $40490FDB< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_NPI< / span > < span class = "plain" > = < / span > < span class = "constant" > $C0490FDB< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_2PI< / span > < span class = "plain" > = < / span > < span class = "constant" > $40C90FDB< / span > < span class = "plain" > ; < / span > < span class = "comment" > 2*pi< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_PI2< / span > < span class = "plain" > = < / span > < span class = "constant" > $3FC90FDB< / span > < span class = "plain" > ; < / span > < span class = "comment" > pi/2< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_NPI2< / span > < span class = "plain" > = < / span > < span class = "constant" > $BFC90FDB< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_E< / span > < span class = "plain" > = < / span > < span class = "constant" > $402DF854< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_E2< / span > < span class = "plain" > = < / span > < span class = "constant" > $40EC7326< / span > < span class = "plain" > ; < / span > < span class = "comment" > e^2< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_N0< / span > < span class = "plain" > = < / span > < span class = "constant" > $80000000< / span > < span class = "plain" > ; < / span > < span class = "comment" > negative zero< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_INF< / span > < span class = "plain" > = < / span > < span class = "constant" > $7F800000< / span > < span class = "plain" > ; < / span > < span class = "comment" > infinity< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_NINF< / span > < span class = "plain" > = < / span > < span class = "constant" > $FF800000< / span > < span class = "plain" > ; < / span > < span class = "comment" > negative infinity< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_NAN< / span > < span class = "plain" > = < / span > < span class = "constant" > $7F800001< / span > < span class = "plain" > ; < / span > < span class = "comment" > one of many NaN values< / span >
< span class = "reserved" > Constant< / span > < span class = "plain" > < / span > < span class = "identifier" > M_NNAN< / span > < span class = "plain" > = < / span > < span class = "constant" > $FF800001< / span > < span class = "plain" > ; < / span > < span class = "comment" > another, with a sign bit< / span >
< span class = "comment" > Floating-point parsing routines.< / span >
< span class = "comment" > Parse a float from a text buffer. Returns a float value, or FLOAT_NAN if< / span >
< span class = "comment" > no value was understood.< / span >
< span class = "comment" > The recognized format, if you'll pardon a slightly bastardized regexp< / span >
< span class = "comment" > syntax, is "S?D*(PD*)?(ES?D+)?" where S is a sign character "+" or "-",< / span >
< span class = "comment" > D is a decimal digit "0" to "9", P is a decimal point ".",< / span >
< span class = "comment" > and E is the exponential modifier "E" or "e".< / span >
< span class = "comment" > For flexibility, the string "M10^" is also accepted for E, where M is< / span >
< span class = "comment" > "X", "x", "*", or the multiplication sign @{D7}. Optional spaces are< / span >
< span class = "comment" > allowed before and after the M sign. (But only for the "10^" form of< / span >
< span class = "comment" > the exponent, not the "e" form.)< / span >
< span class = "comment" > This routine does not try to recognize special names for infinity or NaN,< / span >
< span class = "comment" > but it can return FLOAT_INFINITY or FLOAT_NINFINITY if the exponent is too< / span >
< span class = "comment" > large.< / span >
< span class = "comment" > This routine relies on floating-point math. Therefore, the same string< / span >
2020-04-14 19:56:54 +03:00
< span class = "comment" > may parse to slightly different float values on different interpreters!< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Be warned.< / span >
< span class = "comment" > If useall is true, this insists on using all len characters from the buffer.< / span >
< span class = "comment" > (It returns FLOAT_NAN if any unrecognized characters are left over.)< / span >
< span class = "comment" > Contrariwise, if useall is false, unused characters at the end of the buffer< / span >
< span class = "comment" > are fine. (But not at the beginning; the float must start at the beginning< / span >
< span class = "comment" > of the buffer.)< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > FloatParse< / span > < span class = "plain" > < / span > < span class = "identifier" > buf< / span > < span class = "plain" > < / span > < span class = "identifier" > len< / span > < span class = "plain" > < / span > < span class = "identifier" > useall< / span >
< span class = "identifier" > res< / span > < span class = "plain" > < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > ch< / span > < span class = "plain" > < / span > < span class = "identifier" > ten< / span > < span class = "plain" > < / span > < span class = "identifier" > negative< / span > < span class = "plain" > < / span > < span class = "identifier" > intpart< / span > < span class = "plain" > < / span > < span class = "identifier" > fracpart< / span > < span class = "plain" > < / span > < span class = "identifier" > fracdiv< / span >
< span class = "identifier" > expon< / span > < span class = "plain" > < / span > < span class = "identifier" > expnegative< / span > < span class = "plain" > < / span > < span class = "identifier" > count< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > print "FloatParse < ";< / span >
< span class = "comment" > for (ix=0: ix< len: ix++) print (char) buf-> ix;< / span >
< span class = "comment" > print "> ^";< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > len< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > negative< / span > < span class = "plain" > = < / span > < span class = "reserved" > false< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > intpart< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > fracpart< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > ten< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Sign character (optional)< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > ch< / span > < span class = "plain" > = < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > == < / span > < span class = "character" > '-'< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > negative< / span > < span class = "plain" > = < / span > < span class = "reserved" > true< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > else< / span > < span class = "plain" > < / span > < span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > == < / span > < span class = "character" > '+'< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Some digits (optional)< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "identifier" > count< / span > < span class = "plain" > =0 : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > len< / span > < span class = "plain" > : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ++, < / span > < span class = "identifier" > count< / span > < span class = "plain" > ++) {< / span >
< span class = "identifier" > ch< / span > < span class = "plain" > = < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > < < / span > < span class = "character" > '0'< / span > < span class = "plain" > || < / span > < span class = "identifier" > ch< / span > < span class = "plain" > > < / span > < span class = "character" > '9'< / span > < span class = "plain" > )< / span >
< span class = "reserved" > break< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > val< / span > < span class = "plain" > = (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > - < / span > < span class = "character" > '0'< / span > < span class = "plain" > );< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > intpart< / span > < span class = "plain" > < / span > < span class = "identifier" > ten< / span > < span class = "plain" > < / span > < span class = "identifier" > intpart< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fadd< / span > < span class = "plain" > < / span > < span class = "identifier" > intpart< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > intpart< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Decimal point and more digits (optional)< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > len< / span > < span class = "plain" > & & < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "character" > '.'< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > < / span > < span class = "identifier" > fracdiv< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > for< / span > < span class = "plain" > ( : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > len< / span > < span class = "plain" > : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ++, < / span > < span class = "identifier" > count< / span > < span class = "plain" > ++) {< / span >
< span class = "identifier" > ch< / span > < span class = "plain" > = < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > < < / span > < span class = "character" > '0'< / span > < span class = "plain" > || < / span > < span class = "identifier" > ch< / span > < span class = "plain" > > < / span > < span class = "character" > '9'< / span > < span class = "plain" > )< / span >
< span class = "reserved" > break< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > val< / span > < span class = "plain" > = (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > - < / span > < span class = "character" > '0'< / span > < span class = "plain" > );< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > fracpart< / span > < span class = "plain" > < / span > < span class = "identifier" > ten< / span > < span class = "plain" > < / span > < span class = "identifier" > fracpart< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fadd< / span > < span class = "plain" > < / span > < span class = "identifier" > fracpart< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > fracpart< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > fracdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > ten< / span > < span class = "plain" > < / span > < span class = "identifier" > fracdiv< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > fracpart< / span > < span class = "plain" > < / span > < span class = "identifier" > fracdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > fracpart< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > If there are no digits before *or* after the decimal point, fail.< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > count< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-04-07 03:06:09 +03:00
< span class = "comment" > Combine the integer and fractional parts.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > fadd< / span > < span class = "plain" > < / span > < span class = "identifier" > intpart< / span > < span class = "plain" > < / span > < span class = "identifier" > fracpart< / span > < span class = "plain" > < / span > < span class = "identifier" > res< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-04-07 03:06:09 +03:00
< span class = "comment" > Exponent (optional)< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > len< / span > < span class = "plain" > & & < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "character" > 'e'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'E'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > ' '< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '*'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'x'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'X'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "constant" > $D7< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "character" > 'e'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'E'< / span > < span class = "plain" > ) {< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > no spaces, just the 'e'< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "identifier" > len< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > else< / span > < span class = "plain" > {< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > any number of spaces, "*", any number of spaces more, "10^"< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > while< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > len< / span > < span class = "plain" > & & < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "character" > ' '< / span > < span class = "plain" > )< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "identifier" > len< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ~= < / span > < span class = "character" > '*'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'x'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'X'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "constant" > $D7< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > while< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > len< / span > < span class = "plain" > & & < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "character" > ' '< / span > < span class = "plain" > )< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "identifier" > len< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ~= < / span > < span class = "character" > '1'< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ~= < / span > < span class = "character" > '0'< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ~= < / span > < span class = "constant" > $5E< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Sign character (optional)< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > expnegative< / span > < span class = "plain" > = < / span > < span class = "reserved" > false< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ch< / span > < span class = "plain" > = < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > == < / span > < span class = "character" > '-'< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > expnegative< / span > < span class = "plain" > = < / span > < span class = "reserved" > true< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > else< / span > < span class = "plain" > < / span > < span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > == < / span > < span class = "character" > '+'< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > ix< / span > < span class = "plain" > ++;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > expon< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Some digits (mandatory)< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "identifier" > count< / span > < span class = "plain" > =0 : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > len< / span > < span class = "plain" > : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ++, < / span > < span class = "identifier" > count< / span > < span class = "plain" > ++) {< / span >
< span class = "identifier" > ch< / span > < span class = "plain" > = < / span > < span class = "identifier" > buf< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > < < / span > < span class = "character" > '0'< / span > < span class = "plain" > || < / span > < span class = "identifier" > ch< / span > < span class = "plain" > > < / span > < span class = "character" > '9'< / span > < span class = "plain" > )< / span >
< span class = "reserved" > break< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > expon< / span > < span class = "plain" > = < / span > < span class = "constant" > 10< / span > < span class = "plain" > *< / span > < span class = "identifier" > expon< / span > < span class = "plain" > + (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > - < / span > < span class = "character" > '0'< / span > < span class = "plain" > );< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > count< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > expnegative< / span > < span class = "plain" > )< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > expon< / span > < span class = "plain" > = -< / span > < span class = "identifier" > expon< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > expon< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > expon< / span > < span class = "plain" > < / span > < span class = "identifier" > expon< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > pow< / span > < span class = "plain" > < / span > < span class = "identifier" > ten< / span > < span class = "plain" > < / span > < span class = "identifier" > expon< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > res< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > res< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > negative< / span > < span class = "plain" > ) {< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > set the value's sign bit< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > res< / span > < span class = "plain" > = < / span > < span class = "constant" > $80000000< / span > < span class = "plain" > | < / span > < span class = "identifier" > res< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > useall< / span > < span class = "plain" > & & < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ~= < / span > < span class = "identifier" > len< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > res< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Floating-point printing routines. (These are based on code in< / span >
< span class = "comment" > Glulxercise.inf, but modified.)< / span >
< span class = "comment" > Print a float. This uses exponential notation ("[-]N.NNNe[+-]NN") if< / span >
< span class = "comment" > the exponent is not between 6 and -4. If it is (that is, if the< / span >
< span class = "comment" > absolute value is near 1.0) then it uses decimal notation ("[-]NNN.NNNNN").< / span >
< span class = "comment" > The precision is the number of digits after the decimal point< / span >
< span class = "comment" > (at least one, no more than eight). The default is five, because< / span >
< span class = "comment" > beyond that rounding errors creep in, and even exactly-represented< / span >
< span class = "comment" > float values are printed with trailing fudgy digits.< / span >
< span class = "comment" > Trailing zeroes are trimmed.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > Float< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > prec< / span > < span class = "plain" > < / span > < span class = "identifier" > pval< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > pval< / span > < span class = "plain" > = < / span > < span class = "identifier" > val< / span > < span class = "plain" > & < / span > < span class = "constant" > $7FFFFFFF< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jz< / span > < span class = "plain" > < / span > < span class = "identifier" > pval< / span > < span class = "plain" > ?< / span > < span class = "identifier" > UseFloatDec< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "plain" > @< / span > < span class = "identifier" > jfge< / span > < span class = "plain" > < / span > < span class = "identifier" > pval< / span > < span class = "plain" > < / span > < span class = "constant" > $49742400< / span > < span class = "plain" > ?< / span > < span class = "identifier" > UseFloatExp< / span > < span class = "plain" > ; < / span > < span class = "comment" > 1000000.0< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jflt< / span > < span class = "plain" > < / span > < span class = "identifier" > pval< / span > < span class = "plain" > < / span > < span class = "constant" > $38D1B717< / span > < span class = "plain" > ?< / span > < span class = "identifier" > UseFloatExp< / span > < span class = "plain" > ; < / span > < span class = "comment" > 0.0001< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > UseFloatDec< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FloatDec< / span > < span class = "plain" > (< / span > < span class = "identifier" > val< / span > < span class = "plain" > , < / span > < span class = "identifier" > prec< / span > < span class = "plain" > );< / span >
< span class = "plain" > .< / span > < span class = "identifier" > UseFloatExp< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FloatExp< / span > < span class = "plain" > (< / span > < span class = "identifier" > val< / span > < span class = "plain" > , < / span > < span class = "identifier" > prec< / span > < span class = "plain" > );< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > Array< / span > < span class = "plain" > < / span > < span class = "identifier" > PowersOfTen< / span > < span class = "plain" > --> < / span > < span class = "constant" > 1< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "constant" > 100< / span > < span class = "plain" > < / span > < span class = "constant" > 1000< / span > < span class = "plain" > < / span > < span class = "constant" > 10000< / span > < span class = "plain" > < / span > < span class = "constant" > 100000< / span > < span class = "plain" > < / span > < span class = "constant" > 1000000< / span > < span class = "plain" > < / span > < span class = "constant" > 10000000< / span > < span class = "plain" > < / span > < span class = "constant" > 100000000< / span > < span class = "plain" > < / span > < span class = "constant" > 1000000000< / span > < span class = "plain" > ;< / span >
2020-01-12 02:35:36 +02:00
2020-04-07 03:06:09 +03:00
< span class = "comment" > Print a float in exponential notation: "[-]N.NNNe[+-]NN".< / span >
< span class = "comment" > The precision is the number of digits after the decimal point< / span >
< span class = "comment" > (at least one, no more than eight). The default is five, because< / span >
< span class = "comment" > beyond that rounding errors creep in, and even exactly-represented< / span >
< span class = "comment" > float values are printed with trailing fudgy digits.< / span >
< span class = "comment" > Trailing zeroes are trimmed.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > FloatExp< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > prec< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > < / span > < span class = "identifier" > expo< / span > < span class = "plain" > < / span > < span class = "identifier" > fexpo< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > prec< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > )< / span >
< span class = "identifier" > prec< / span > < span class = "plain" > = < / span > < span class = "constant" > 5< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > prec< / span > < span class = "plain" > > < / span > < span class = "constant" > 8< / span > < span class = "plain" > )< / span >
< span class = "identifier" > prec< / span > < span class = "plain" > = < / span > < span class = "constant" > 8< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > pow10< / span > < span class = "plain" > = < / span > < span class = "identifier" > PowersOfTen< / span > < span class = "plain" > --> < / span > < span class = "identifier" > prec< / span > < span class = "plain" > ;< / span >
2020-01-12 02:35:36 +02:00
2020-04-07 03:06:09 +03:00
< span class = "comment" > Knock off the sign bit first.< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > val< / span > < span class = "plain" > & < / span > < span class = "constant" > $80000000< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > '-'< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > val< / span > < span class = "plain" > = < / span > < span class = "identifier" > val< / span > < span class = "plain" > & < / span > < span class = "constant" > $7FFFFFFF< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > jisnan< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > ?< / span > < span class = "identifier" > IsNan< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jisinf< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > ?< / span > < span class = "identifier" > IsInf< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > val< / span > < span class = "plain" > == < / span > < span class = "constant" > $0< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > expo< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > idig< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > jump< / span > < span class = "plain" > < / span > < span class = "identifier" > DoPrint< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Take as an example val=123.5, with precision=6. The desired< / span >
< span class = "comment" > result is "1.23000e+02".< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > log< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
2020-04-14 19:56:54 +03:00
< span class = "plain" > @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "constant" > $40135D8E< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > ; < / span > < span class = "comment" > \(40135D8E is log(10)< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > floor< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > < / span > < span class = "identifier" > fexpo< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > ftonumn< / span > < span class = "plain" > < / span > < span class = "identifier" > fexpo< / span > < span class = "plain" > < / span > < span class = "identifier" > expo< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > expo is now the exponent (as an integer). For our example, expo=2.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > fsub< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > < / span > < span class = "identifier" > fexpo< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > prec< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fadd< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "constant" > $40135D8E< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > exp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > The stack value is now exp((log10val - fexpo + prec) * log(10)).< / span >
< span class = "comment" > We've shifted the decimal point left by expo digits (so that< / span >
< span class = "comment" > it's after the first nonzero digit), and then right by prec< / span >
< span class = "comment" > digits. In our example, that would be 1235000.0.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > ftonumn< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Round to an integer, and we have 1235000. Notice that this is< / span >
< span class = "comment" > exactly the digits we want to print (if we stick a decimal point< / span >
< span class = "comment" > after the first).< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > DoPrint< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > idig< / span > < span class = "plain" > > = < / span > < span class = "constant" > 10< / span > < span class = "plain" > *< / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ) {< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Rounding errors have left us outside the decimal range of< / span >
< span class = "comment" > [1.0, 10.0) where we should be. Adjust to the next higher< / span >
< span class = "comment" > exponent.< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > expo< / span > < span class = "plain" > ++;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Trim off trailing zeroes, as long as there's at least one digit< / span >
< span class = "comment" > after the decimal point. (Delete this stanza if you want to< / span >
< span class = "comment" > keep the trailing zeroes.)< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > while< / span > < span class = "plain" > (< / span > < span class = "identifier" > prec< / span > < span class = "plain" > > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > mod< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jnz< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ?< / span > < span class = "identifier" > DoneTrimming< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > prec< / span > < span class = "plain" > --;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > DoneTrimming< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > =0 : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < =< / span > < span class = "identifier" > prec< / span > < span class = "plain" > : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ++) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > mod< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamnum< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > )< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > '.'< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Print the exponent. There are two conventions coded here: the< / span >
< span class = "comment" > programmatic ("1.0e+00") and the literary ("1.0 x 10^0").< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > TEMPLATE_CONFIGURATION_BITMAP< / span > < span class = "plain" > & < / span > < span class = "identifier" > PROGRAMMING_EXPONENTS_TCBIT< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > PrintMultiplicationSign< / span > < span class = "plain" > ();< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamstr< / span > < span class = "plain" > < / span > < span class = "string" > "10"< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "constant" > $5E< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamnum< / span > < span class = "plain" > < / span > < span class = "identifier" > expo< / span > < span class = "plain" > ;< / span >
< span class = "plain" > } < / span > < span class = "reserved" > else< / span > < span class = "plain" > {< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Convention is to use at least two digits.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > 'e'< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > expo< / span > < span class = "plain" > < < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > '-'< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > neg< / span > < span class = "plain" > < / span > < span class = "identifier" > expo< / span > < span class = "plain" > < / span > < span class = "identifier" > expo< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > else< / span > < span class = "plain" > {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > '+'< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > expo< / span > < span class = "plain" > < < / span > < span class = "constant" > 10< / span > < span class = "plain" > )< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > '0'< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamnum< / span > < span class = "plain" > < / span > < span class = "identifier" > expo< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > rtrue< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > IsNan< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > PrintNan< / span > < span class = "plain" > ();< / span >
< span class = "reserved" > rtrue< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > IsInf< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > PrintInfinity< / span > < span class = "plain" > ();< / span >
< span class = "reserved" > rtrue< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Print a float in decimal notation: "[-]NNN.NNNNN".< / span >
< span class = "comment" > The precision is the number of digits after the decimal point< / span >
< span class = "comment" > (at least one, no more than eight). The default is five, because< / span >
< span class = "comment" > beyond that rounding errors creep in, and even exactly-represented< / span >
< span class = "comment" > float values are printed with trailing fudgy digits.< / span >
< span class = "comment" > Trailing zeroes are trimmed.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > FloatDec< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "identifier" > prec< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > fint< / span > < span class = "plain" > < / span > < span class = "identifier" > extra0< / span > < span class = "plain" > < / span > < span class = "identifier" > frac< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > prec< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > )< / span >
< span class = "identifier" > prec< / span > < span class = "plain" > = < / span > < span class = "constant" > 5< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > prec< / span > < span class = "plain" > > < / span > < span class = "constant" > 8< / span > < span class = "plain" > )< / span >
< span class = "identifier" > prec< / span > < span class = "plain" > = < / span > < span class = "constant" > 8< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > pow10< / span > < span class = "plain" > = < / span > < span class = "identifier" > PowersOfTen< / span > < span class = "plain" > --> < / span > < span class = "identifier" > prec< / span > < span class = "plain" > ;< / span >
2020-01-12 02:35:36 +02:00
2020-04-07 03:06:09 +03:00
< span class = "comment" > Knock off the sign bit first.< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > val< / span > < span class = "plain" > & < / span > < span class = "constant" > $80000000< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > '-'< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > val< / span > < span class = "plain" > = < / span > < span class = "identifier" > val< / span > < span class = "plain" > & < / span > < span class = "constant" > $7FFFFFFF< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > jisnan< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > ?< / span > < span class = "identifier" > IsNan< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jisinf< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > ?< / span > < span class = "identifier" > IsInf< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Take as an example val=123.5, with precision=6. The desired result< / span >
< span class = "comment" > is "123.50000".< / span >
2020-01-12 02:35:36 +02:00
< span class = "identifier" > extra0< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
2020-04-14 19:56:54 +03:00
< span class = "plain" > @< / span > < span class = "identifier" > fmod< / span > < span class = "plain" > < / span > < span class = "identifier" > val< / span > < span class = "plain" > < / span > < span class = "constant" > $3F800000< / span > < span class = "plain" > < / span > < span class = "identifier" > frac< / span > < span class = "plain" > < / span > < span class = "identifier" > fint< / span > < span class = "plain" > ; < / span > < span class = "comment" > \(3F800000 is 1.0.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > ftonumz< / span > < span class = "plain" > < / span > < span class = "identifier" > fint< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > This converts the integer part of the value to an integer value;< / span >
< span class = "comment" > in our example, 123.< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > int< / span > < span class = "plain" > == < / span > < span class = "constant" > $7FFFFFFF< / span > < span class = "plain" > ) {< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Looks like the integer part of the value is bigger than< / span >
< span class = "comment" > we can store in an int variable. (It could be as large< / span >
< span class = "comment" > as 3e+38.) We're going to have to use a log function to< / span >
< span class = "comment" > reduce it by some number of factors of 10, and then pad< / span >
< span class = "comment" > with zeroes.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > log< / span > < span class = "plain" > < / span > < span class = "identifier" > fint< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
2020-04-14 19:56:54 +03:00
< span class = "plain" > @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "constant" > $40135D8E< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > ; < / span > < span class = "comment" > \(40135D8E is log(10)< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > ftonumz< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > < / span > < span class = "identifier" > extra0< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > sub< / span > < span class = "plain" > < / span > < span class = "identifier" > extra0< / span > < span class = "plain" > < / span > < span class = "constant" > 8< / span > < span class = "plain" > < / span > < span class = "identifier" > extra0< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > extra0 is the number of zeroes we'll be padding with.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > extra0< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fsub< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "constant" > $40135D8E< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > exp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > The stack value is now exp((log10val - extra0) * log(10)).< / span >
< span class = "comment" > We've shifted the decimal point far enough left to leave< / span >
< span class = "comment" > about eight digits, which is all we can print as an integer.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > ftonumz< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Print the integer part.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > streamnum< / span > < span class = "plain" > < / span > < span class = "identifier" > int< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > =0 : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > extra0< / span > < span class = "plain" > : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ++)< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > '0'< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamchar< / span > < span class = "plain" > < / span > < span class = "character" > '.'< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Now we need to print the frac part, which is .5.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > log< / span > < span class = "plain" > < / span > < span class = "identifier" > frac< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
2020-04-14 19:56:54 +03:00
< span class = "plain" > @< / span > < span class = "identifier" > fdiv< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "constant" > $40135D8E< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > ; < / span > < span class = "comment" > \(40135D8E is log(10)< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > numtof< / span > < span class = "plain" > < / span > < span class = "identifier" > prec< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fadd< / span > < span class = "plain" > < / span > < span class = "identifier" > log10val< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > fmul< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "constant" > $40135D8E< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > exp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > The stack value is now exp((frac + prec) * log(10)).< / span >
< span class = "comment" > We've shifted the decimal point right by prec< / span >
< span class = "comment" > digits. In our example, that would be 50000.0.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > @< / span > < span class = "identifier" > ftonumn< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Round to an integer, and we have 50000. Notice that this is< / span >
< span class = "comment" > exactly the (post-decimal-point) digits we want to print.< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > DoPrint< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > idig< / span > < span class = "plain" > > = < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ) {< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Rounding errors have left us outside the decimal range of< / span >
< span class = "comment" > [0.0, 1.0) where we should be. I'm not sure this is possible,< / span >
< span class = "comment" > actually, but we'll just adjust downward.< / span >
< span class = "identifier" > idig< / span > < span class = "plain" > = < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > - < / span > < span class = "constant" > 1< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > Trim off trailing zeroes, as long as there's at least one digit< / span >
< span class = "comment" > after the decimal point. (Delete this stanza if you want to< / span >
< span class = "comment" > keep the trailing zeroes.)< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > while< / span > < span class = "plain" > (< / span > < span class = "identifier" > prec< / span > < span class = "plain" > > < / span > < span class = "constant" > 1< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > mod< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > jnz< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ?< / span > < span class = "identifier" > DoneTrimming< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > prec< / span > < span class = "plain" > --;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > DoneTrimming< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > =0 : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > prec< / span > < span class = "plain" > : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ++) {< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > idig< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > mod< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamnum< / span > < span class = "plain" > < / span > < span class = "identifier" > sp< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > div< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > < / span > < span class = "constant" > 10< / span > < span class = "plain" > < / span > < span class = "identifier" > pow10< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-12 02:35:36 +02:00
< span class = "reserved" > rtrue< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > IsNan< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > PrintNan< / span > < span class = "plain" > ();< / span >
< span class = "reserved" > rtrue< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "plain" > .< / span > < span class = "identifier" > IsInf< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > PrintInfinity< / span > < span class = "plain" > ();< / span >
< span class = "reserved" > rtrue< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > PrintInfinity< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamunichar< / span > < span class = "plain" > < / span > < span class = "constant" > $221E< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > @streamstr "Inf";< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > PrintNan< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamunichar< / span > < span class = "plain" > < / span > < span class = "constant" > $26a0< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > @streamstr "NaN";< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > PrintMultiplicationSign< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > print< / span > < span class = "plain" > < / span > < span class = "string" > " "< / span > < span class = "plain" > ;< / span >
< span class = "plain" > @< / span > < span class = "identifier" > streamunichar< / span > < span class = "plain" > < / span > < span class = "constant" > $D7< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > print< / span > < span class = "plain" > < / span > < span class = "string" > " "< / span > < span class = "plain" > ;< / span >
2020-04-07 03:06:09 +03:00
< span class = "comment" > @streamstr " x ";< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-04-07 03:06:09 +03:00
< span class = "plain" > #< / span > < span class = "identifier" > Ifnot< / span > < span class = "plain" > ; < / span > < span class = "comment" > TARGET_GLULX< / span >
2020-01-10 01:10:09 +02:00
2020-04-07 03:06:09 +03:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Say< / span > < span class = "plain" > < / span > < span class = "identifier" > real< / span > < span class = "plain" > ; < / span > < span class = "reserved" > print< / span > < span class = "plain" > < / span > < span class = "identifier" > real< / span > < span class = "plain" > ; ]; < / span > < span class = "comment" > Needs to exist, but likely never used< / span >
2020-01-10 01:10:09 +02:00
2020-01-12 02:35:36 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > REAL_NUMBER_TY_Compare< / span > < span class = "plain" > < / span > < span class = "identifier" > r1< / span > < span class = "plain" > < / span > < span class = "identifier" > r2< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > UnsignedCompare< / span > < span class = "plain" > (< / span > < span class = "identifier" > r1< / span > < span class = "plain" > , < / span > < span class = "identifier" > r2< / span > < span class = "plain" > ); ];< / span >
2020-01-10 01:10:09 +02:00
2020-04-07 03:06:09 +03:00
< span class = "plain" > #< / span > < span class = "identifier" > Endif< / span > < span class = "plain" > ; < / span > < span class = "comment" > TARGET_GLULX< / span >
2020-01-10 01:10:09 +02:00
< / pre >
< p class = "inwebparagraph" > < / p >
< hr class = "tocbar" >
2020-04-14 19:56:54 +03:00
< ul class = "toc" > < li > < a href = "S-prg.html" > Back to 'Paragraphing'< / a > < / li > < li > < a href = "S-fl.html" > Continue with 'FileIO Template'< / a > < / li > < / ul > < hr class = "tocbar" >
2020-01-10 01:10:09 +02:00
<!-- End of weave -->
2020-04-14 19:56:54 +03:00
< script >
MathJax = {
tex: {
inlineMath: '$', '$'], ['\\(', '\\)'
},
svg: {
fontCache: 'global'
}
};
< / script >
< script type = "text/javascript" id = "MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
< / script >
2020-03-19 02:11:25 +02:00
< / main >
2020-01-10 01:10:09 +02:00
< / body >
< / html >