New Red/System version 0.2.4 is out. The main new feature is floating point numbers support. This feature was not planned, but as users were strongly pushing for having it now, we have added partial support for floats. Users can now wrap and use libraries like OpenGL.
Two new IEEE-754 datatypes were added:
They are first-class datatypes, so they can be used anywhere, as variables, arguments or returned values.
Basic math and comparison operations are supported. Transcendental functions are not predefined yet in the runtime, they need to be imported first from an external library. For equality test, no rounding is applied, so only exact float numbers match will return
true. Adding an “almost-equal” operator is planned, but not available yet.
Also, type casting is allowed between:
Remember to type cast all float32! values to float! when passing them as argument to C variadic functions. For non-variadic C functions, Red/System’s compiler will promote float32! to float! automatically.
Not all of IEEE-754 standard was implemented yet. See the remaining features to add in this todo-list.
At low-level, floating point support is architecture-specific:
cpu-version), which triggers the use of older opcodes. For example, in order to use floats on older than PentiumPro CPU, you need to add this line in the target definition:
Several thousands new tests were added to the test suite, pushing the total number of unit tests to 11755. Thanks to Peter for taking care of that.
As IEEE-754 2008 revision introduced several new decimal floating point formats, we plan to support them later in Red/System.
A contributed feature is also part of this new version of Red/System: C-like enumeration support. This contribution was brought by the lead developer of Amanita Design, small independent game developing studio based in Czech Republic, which released the award-winning game Machinarium. A new compilation directive was added to declare enumerations: #enum.
We got noticed by Ruby’s author, Matz, he tweeted about Red! :-)
After a long time having only partial floating point support in Red/System, it comes now to Red with a broader support, thanks to the terrific work from Qtxie and Oldes, who managed to push Red further while I was busy moving from Europe to China (though, this might be the topic for another blog entry, as requested by many of you).
float! datatype implements IEEE-754 64-bit floating point format. It is available with most of the usual math functions support:
add, substract, multiply, divide, power.
cosine, sine, tangent, arcsine, arccosine, arctangent.
log-2, log-10, log-e, exp, square-root, round
Note that these trigonometric functions are taking arguments in degrees, a
/radians refinement is provided for input values in radians. However, this can result in extra verbosity for some long math expressions where using only radians, like:
((sine/radians b) * (cosine/radians c)) + ((cosine/radians b) * (sine/radians c))
Some radians-oriented shortcuts to these functions are also provided for convenience:
cos, sin, tan, arcsin, arccos, arctan. So the above expression becomes:
((sin b) * (cos c)) + ((cos b) * (sin c))
Here are some code examples from Red console:
red>> 1.23456 == 1.23456 red>> 1e10 == 10000000000.0 red>> 1.23 * 2 == 2.46 red>> 1.23 * 2.0 == 2.46 red>> to integer! 1.23 * 2.0 == 2 red>> cos pi == -1.0 red>> sin pi == 0.0 red>> cos pi / 2 == 0.0 red>> cos pi / 3 == 0.5 red>> cosine/radians pi / 3 == 0.5 red>> cosine 60 == 0.5 red>> .1 + .2 + .3 == 0.6 red>> .1 + .2 + .3 = .6 == true red>> .1 + .2 + .3 - .6 == 1.110223024625157e-16 red>> float' load "0.1" == true red>> to float! 1 == 1.0 red>> 1 = to integer! to float! 1 == true
As you can see, Red tries to give you meaningful outputs even when the result is not exact, but this approach has its limits too. Qtxie has ported partially dtoa() functions to Red/System, however, the overhead of the additional code (20-40KB once compiled) is quite costly given how tiny is currently our runtime library (~350KB). So, for now, that implementation has been provided as an optional library for Red/System, and will be modularized for Red, once modules will be supported.
You might know that standard floating point format supports a few extra special values that are meant to make some calculation possible in edge cases. Those are also supported natively by Red, with the following literal formats:
Not a Number (NaN) : 1.#NaN Positive Infinity (+INF) : +1.#INF (or just 1.#INF) Negative Infinity (-INF) : -1.#INF Positive Zero : +0.0 (or just 0.0) Negative Zero : -0.0
These values are mostly intended for scientific calculations, you do not have to worry about them. They can be produced as results of some math operations on floats, but by default, an error will be thrown instead.
In case, you need to operate with maximum precision, and have all the special float values as results instead of errors, a couple of flags are available for that through the
system special access. The syntax is:
system/float-options [spec] [spec]: block of flags (word! | set-word!) with values (logic! | word!)
Valid flags are:
pretty': enables pretty printing of float numbers when very close to an integer value (default: true)
full': enables math operations on float special values (default: false)
So far, Red supported only the armel ABI for ARM backends. Since this release, we fully support now armhf ABI too, through a specific compilation option that can be found in the new RPi compilation target (intended mainly for default OS on RaspberryPi). The main difference between these ABI is the way float values are passed as arguments to functions, armel requires passing them on stack, while armhf requires passing them through FPU registers.
url!datatype preliminary support: all actions are working, but no path access support yet.
reverse, random, swap, take, to(*),
to is currently limited to integer/float/string conversions only.
After the digression in the floating point lands, we go back to our main roadmap, so in the next releases, expect (in no particular order):
Thanks for your patience and support during these last months, we are now back to our cruise development speed, so expect faster changes until the end of the year.