class library: DUGen - the server now handles audio-rate inputs correctly
[supercollider.git] / SCClassLibrary / Common / Math / Float.sc
blob9cfbc4374c0f43da9cd8d74c5533171ab2368d17
1 Float : SimpleNumber {
2         isFloat { ^true }
3         asFloat { ^this }
5         + { arg aNumber, adverb; _AddFloat; ^aNumber.performBinaryOpOnSimpleNumber('+', this, adverb) }
6         - { arg aNumber, adverb; _SubFloat; ^aNumber.performBinaryOpOnSimpleNumber('-', this, adverb) }
7         * { arg aNumber, adverb; _MulFloat; ^aNumber.performBinaryOpOnSimpleNumber('*', this, adverb) }
9         clip { arg lo, hi; _ClipFloat; ^this.primitiveFailed }
10         wrap { arg lo, hi; _WrapFloat; ^this.primitiveFailed }
11         fold { arg lo, hi; _FoldFloat; ^this.primitiveFailed }
13         coin { ^1.0.rand < this }
14         xrand2 { ^this.rand2 }
17         // returns an Integer which is the bit pattern of this as a
18         // 32bit single precision float
19         as32Bits { _As32Bits }
21         // returns an Integer which is the bit pattern of high
22         // 32 bits of the 64 bit double precision floating point value
23         high32Bits { _High32Bits }
24         low32Bits { _Low32Bits }
26         *from32Bits { arg word;
27                 _From32Bits
28                 ^this.primitiveFailed
29         }
30         *from64Bits { arg hiWord, loWord;
31                 _From64Bits
32                 ^this.primitiveFailed
33         }
35         // iteration
36         do { arg function;
37                 // iterates function from 0 to this-1
38                 // special byte codes inserted by compiler for this method
39                 var i = 0.0;
40                 while ({ (i + 0.5) < this }, { function.value(i, i); i = i + 1.0; });
41         }
43         reverseDo { arg function;
44                 // iterates function from this-1 to 0
45                 // special byte codes inserted by compiler for this method
46                 var i, j=0.0;
47                 i = this - 1.0;
48                 while ({ (i + 0.5) >= 0.0 }, { function.value(i, j); i = i - 1.0; j = j + 1.0; });
49         }
51         asStringPrec { arg precision;
52                 _Float_AsStringPrec
53                 ^this.primitiveFailed
54         }
56         archiveAsCompileString { ^true }
58         // the correct place to implement compileString for Float is in DumpParseNode.cpp
59         // int asCompileString(PyrSlot *slot, char *str)
60         // for now, solve it here.
62         storeOn { |stream|
63                 var     str;
64                 if(this == inf) { stream << "inf"; ^this };
65                 if(this == -inf) { stream << "-inf"; ^this };
66                 str = super.asString;
67                 stream << str;
68                 // if it doesn't already have a . or is 1e-05 then add a .0 to force it to Float
69                 if(str.find(".").isNil and: { str.find("e").isNil }) {
70                         stream << ".0";
71                 }
72         }
74         switch { | ... cases|
75                 "Float:switch is unsafe, rounding via Float:asInteger:switch".warn;
76                 ^this.asInteger.switch(*cases)
77         }