Fuzion Logo
flang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

f32.fz


# This file is part of the Fuzion language implementation.
#
# The Fuzion language implementation is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, version 3 of the License.
#
# The Fuzion language implementation is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License along with The
# Fuzion language implementation.  If not, see <https://www.gnu.org/licenses/>.


# -----------------------------------------------------------------------
#
#  Tokiwa Software GmbH, Germany
#
#  Source code of Fuzion standard library feature f32
#
#  Author: Fridtjof Siebert (siebert@tokiwa.software)
#
# -----------------------------------------------------------------------

# f32 -- 32 bit floating point values
#
#
# f32 are binary32-numbers as defined in the IEEE 754-2019 standard, see
# https://ieeexplore.ieee.org/servlet/opac?punumber=8766227
#
f32(val f32) : float f32, f32s is

  redef thiz        => f32.this.val
  redef orderedThis => f32.this.val


  # basic operations: 'prefix -' (negation)
  redef prefix - f32 is intrinsic
  infix + (other f32) f32 is intrinsic
  infix - (other f32) f32 is intrinsic
  infix * (other f32) f32 is intrinsic
  infix / (other f32) f32 is intrinsic
  infix % (other f32) f32 is intrinsic
  infix ** (other f32) f32 is intrinsic


  # comparison
  redef infix == (other f32) bool is intrinsic
  redef infix != (other f32) bool is intrinsic
  redef infix <  (other f32) bool is intrinsic
  redef infix <= (other f32) bool is intrinsic
  redef infix >  (other f32) bool is intrinsic
  redef infix >= (other f32) bool is intrinsic


  # conversion
  redef as_i64 => as_f64.as_i64


  as_f64 f64 is intrinsic


  # casting bit representation to u32
  castTo_u32 u32 is intrinsic


  # create hash code from this number
  hash u64 is
    castTo_u32.hash


  # the fraction of the floating point number
  redef fract f32 is
    if f32s.isNaN val
      NaN
    else if val < 0
      -(-val).fract
    else if val < 1
      val
    else
      bits := castTo_u32
      fract_bits := significandBits.as_u32 - 1
      bias := (u32 2 ** (exponentBits.as_u32 - 1) - 1)
      mask := u32 2 ** exponentBits.as_u32 - 1
      e := ((bits >> fract_bits) & mask) - bias
      if (e < fract_bits)
        x := bits & (u32s.max << (fract_bits - e))
        val - x.castTo_f32
      else
        0.0


  # convert this to a string.
  #
  redef asString string is intrinsic


# f32s -- unit type defining features related to f32 but not requiring an
# instance
#
f32s : floats f32 is

  redef name => "f32"

  redef zero => f32 0
  redef one  => f32 1

  redef bytes => 4
  significandBits => 24
  exponentBits => 8


  redef isNaN(val f32) bool is intrinsic

  redef ℇ => f32 2.7182818284590452354

  redef π => f32 3.14159265358979323846

  redef minExp i32 is intrinsic
  redef maxExp i32 is intrinsic
  redef minPositive f32 is intrinsic
  redef max f32 is intrinsic
  redef epsilon f32 is intrinsic

  redef from_i64(val i64) f32 is
    val.as_f32

  redef squareRoot(val f32) f32 is intrinsic

  redef exp(val f32) f32 is intrinsic
  redef log(val f32) f32 is intrinsic

  redef sin(val f32) f32 is intrinsic
  redef cos(val f32) f32 is intrinsic
  redef tan(val f32) f32 is intrinsic
  redef asin(val f32) f32 is intrinsic
  redef acos(val f32) f32 is intrinsic
  redef atan(val f32) f32 is intrinsic
  redef atan2(y f32, x f32) f32 is intrinsic

  redef sinh(val f32) f32 is intrinsic
  redef cosh(val f32) f32 is intrinsic
  redef tanh(val f32) f32 is intrinsic