From 65cd0b6853ab92805e549e2a5da1f9f2ea45d3c3 Mon Sep 17 00:00:00 2001 From: Michael Sippel <micha@fragmental.art> Date: Tue, 18 Mar 2025 14:06:05 +0100 Subject: [PATCH] add morphisms for angle, temperature & real numbers --- morphisms/angle.morphism-base | 72 +++++++++++++++++++ morphisms/real.morphism-base | 105 ++++++++++++++++++++++++++++ morphisms/temperature.morphism-base | 34 +++++++++ 3 files changed, 211 insertions(+) create mode 100644 morphisms/angle.morphism-base create mode 100644 morphisms/real.morphism-base create mode 100644 morphisms/temperature.morphism-base diff --git a/morphisms/angle.morphism-base b/morphisms/angle.morphism-base new file mode 100644 index 0000000..71aba96 --- /dev/null +++ b/morphisms/angle.morphism-base @@ -0,0 +1,72 @@ +``` +#define PHI 6.28318530718 +``` + +morph_angle_as_degrees_to_turns_float () + Angle ~ Degrees ~ ℝ ~ native.Float +--> Angle ~ Turns ~ ℝ ~ native.Float +``` + *dst = *src / 360.0; + return 0; +``` + +morph_angle_as_degrees_to_turns_double () + Angle ~ Degrees ~ ℝ ~ native.Double +--> Angle ~ Turns ~ ℝ ~ native.Double +``` + *dst = *src / 360.0; + return 0; +``` + + +morph_angle_as_turns_to_degrees_float () + Angle ~ Turns ~ ℝ ~ native.Float +--> Angle ~ Degrees ~ ℝ ~ native.Float +``` + *dst = *src * 360.0; + return 0; +``` + +morph_angle_as_turns_to_degrees_double () + Angle ~ Turns ~ ℝ ~ native.Double +--> Angle ~ Degrees ~ ℝ ~ native.Double +``` + *dst = *src * 360.0; + return 0; +``` + + + + +morph_angle_as_radians_to_turns_float () + Angle ~ Radians ~ ℝ ~ native.Float +--> Angle ~ Turns ~ ℝ ~ native.Float +``` + *dst = *src / PHI; + return 0; +``` + +morph_angle_as_radians_to_turns_double () + Angle ~ Radians ~ ℝ ~ native.Double +--> Angle ~ Turns ~ ℝ ~ native.Double +``` + *dst = *src / PHI; + return 0; +``` + + +morph_angle_as_turns_to_radians_float () + Angle ~ Turns ~ ℝ ~ native.Float +--> Angle ~ Radians ~ ℝ ~ native.Float +``` + *dst = *src * PHI; + return 0; +``` + +morph_angle_as_degrees_to_radians_double () + Angle ~ Turns ~ ℝ ~ native.Double +--> Angle ~ Radians ~ ℝ ~ native.Double +``` + *dst = *src * PHI; + return 0; +``` diff --git a/morphisms/real.morphism-base b/morphisms/real.morphism-base new file mode 100644 index 0000000..204bfbd --- /dev/null +++ b/morphisms/real.morphism-base @@ -0,0 +1,105 @@ +``` +#include <stdio.h> +``` + +morph_real_as_decimalstr_to_float () + ℝ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10>~Char~Ascii~x86.UInt8> +--> ℝ ~ native.Float +``` + sscanf(src, "%f", dst); + return 0; +``` + +morph_real_as_decimalstr_to_double () + ℝ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10>~Char~Ascii~x86.UInt8> +--> ℝ ~ native.Double +``` + sscanf(src, "%lf", dst); + return 0; +``` + +morph_real_as_float_to_decimalstr () + ℝ ~ native.Float +--> ℝ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10>~Char~Ascii~x86.UInt8> +``` + sprintf(dst, "%f", *src); + return 0; +``` + +morph_real_as_double_to_decimalstr () + ℝ ~ native.Double +--> ℝ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10>~Char~Ascii~x86.UInt8> +``` + sprintf(dst, "%f", *src); + return 0; +``` + + +morph_real_as_float_to_double () + ℝ ~ native.Float +--> ℝ ~ native.Double +``` + *dst = *src; + return 0; +``` + +morph_real_as_double_to_float () + ℝ ~ native.Double +--> ℝ ~ native.Float +``` + fprintf(stderr, "Warning: morphin Double -> Float. Precision loss!"); + *dst = *src; + return 0; +``` + +morph_real_as_u64_to_float () + ℝ ~ ℕ ~ x86.UInt64 +--> ℝ ~ native.Float +``` + fprintf(stderr, "Warning: morphin UInt64 -> Float. Precision loss!"); + *dst = *src; + return 0; +``` + +morph_real_as_u64_to_double () + ℝ ~ ℕ ~ x86.UInt64 +--> ℝ ~ native.Double +``` + fprintf(stderr, "Warning: morphin UInt64 -> Double. Precision loss!"); + *dst = *src; + return 0; +``` + +morph_real_as_quantized_linear_to_float (Begin: ℝ, End: ℝ, Steps: ℤ) + ℝ ~ <QuantizedLinear Begin End Steps> ~ ℕ ~ x86.UInt64 +--> ℝ ~ native.Float +``` + *dst = (float)Begin + ( *src * ((float)End - (float)Begin) ) / (float)Steps; + return 0; +``` + +morph_real_as_float_to_quantized_linear (Begin: ℝ, End: ℝ, Steps: ℤ) + ℝ ~ native.Float +--> ℝ ~ <QuantizedLinear Begin End Steps> ~ ℕ ~ x86.UInt64 +``` + *dst = ((*src - (float)Begin) * (float)Steps) / ((float)End - (float)Begin); + return 0; +``` + + + +morph_real_as_quantized_linear_to_double (Begin: ℝ, End: ℝ, Steps: ℤ) + ℝ ~ <QuantizedLinear Begin End Steps> ~ ℕ ~ x86.UInt64 +--> ℝ ~ native.Double +``` + *dst = (double)Begin + ( *src * ((double)End - (double)Begin) ) / (double)Steps; + return 0; +``` + +morph_real_as_double_to_quantized_linear (Begin: ℝ, End: ℝ, Steps: ℤ) + ℝ ~ native.Double +--> ℝ ~ <QuantizedLinear Begin End Steps> ~ ℕ ~ x86.UInt64 +``` + *dst = ((*src - (double)Begin) * (double)Steps) / ((double)End - (double)Begin); + return 0; +``` diff --git a/morphisms/temperature.morphism-base b/morphisms/temperature.morphism-base new file mode 100644 index 0000000..7831292 --- /dev/null +++ b/morphisms/temperature.morphism-base @@ -0,0 +1,34 @@ +``` +``` + +morph_celsius_to_kelvin () + Temperature ~ Celsius ~ ℝ ~ native.Float +--> Temperature ~ Kelvin ~ ℝ ~ native.Float +``` + *dst = *src + 273.15; + return 0; +``` + +morph_kelvin_to_celsius () + Temperature ~ Kelvin ~ ℝ ~ native.Float +--> Temperature ~ Celsius ~ ℝ ~ native.Float +``` + *dst = *src - 273.15; + return 0; +``` + +morph_celsius_to_fahrenheit () + Temperature ~ Celsius ~ ℝ ~ native.Float +--> Temperature ~ Fahrenheit ~ ℝ ~ native.Float +``` + *dst = (*src * 9.0 / 5.0) + 32.0; + return 0; +``` + +morph_fahrenheit_to_celsius () + Temperature ~ Fahrenheit ~ ℝ ~ native.Float +--> Temperature ~ Celsius ~ ℝ ~ native.Float +``` + *dst = (*src - 32.0) * 5.0 / 9.0; + return 0; +```