feed_real_sp Subroutine

private pure subroutine feed_real_sp(state, value)

Canonicalise and feed one real(sp) value.

NaN is tested first, as the one value that is unordered with respect to zero: neither value >= 0 nor value <= 0 holds. That ordered form is used in preference to the more familiar value /= value because it says the same thing without an equality test on a real, which every compiler warns about. Infinities are then separated from finite values by comparison against huge, so that exponent and fraction are only ever applied to a finite, non-zero argument, and zero is finally detected as the value that is not greater than zero in magnitude – which is true for -0.0 as well as +0.0, and is where the two signed zeroes become one.

Arguments

Type IntentOptional Attributes Name
integer(kind=int32), intent(inout) :: state
real(kind=sp), intent(in) :: value

Value to encode; may be any value including -0.0, NaN and +/-Inf.


Calls

proc~~feed_real_sp~~CallsGraph proc~feed_real_sp feed_real_sp proc~feed_real_record feed_real_record proc~feed_real_sp->proc~feed_real_record proc~feed_integer feed_integer proc~feed_real_record->proc~feed_integer proc~fnv1a_byte fnv1a_byte proc~feed_integer->proc~fnv1a_byte

Called by

proc~~feed_real_sp~~CalledByGraph proc~feed_real_sp feed_real_sp proc~update_csp_0 array_hash_t%update_csp_0 proc~update_csp_0->proc~feed_real_sp proc~update_csp_1 array_hash_t%update_csp_1 proc~update_csp_1->proc~feed_real_sp proc~update_rsp_0 array_hash_t%update_rsp_0 proc~update_rsp_0->proc~feed_real_sp proc~update_rsp_1 array_hash_t%update_rsp_1 proc~update_rsp_1->proc~feed_real_sp none~update array_hash_t%update none~update->proc~update_csp_0 none~update->proc~update_csp_1 none~update->proc~update_rsp_0 none~update->proc~update_rsp_1 proc~update_cdp_2 array_hash_t%update_cdp_2 none~update->proc~update_cdp_2 proc~update_cdp_3 array_hash_t%update_cdp_3 none~update->proc~update_cdp_3 proc~update_char_1 array_hash_t%update_char_1 none~update->proc~update_char_1 proc~update_csp_2 array_hash_t%update_csp_2 none~update->proc~update_csp_2 proc~update_csp_3 array_hash_t%update_csp_3 none~update->proc~update_csp_3 proc~update_int16_2 array_hash_t%update_int16_2 none~update->proc~update_int16_2 proc~update_int16_3 array_hash_t%update_int16_3 none~update->proc~update_int16_3 proc~update_int32_2 array_hash_t%update_int32_2 none~update->proc~update_int32_2 proc~update_int32_3 array_hash_t%update_int32_3 none~update->proc~update_int32_3 proc~update_int64_2 array_hash_t%update_int64_2 none~update->proc~update_int64_2 proc~update_int64_3 array_hash_t%update_int64_3 none~update->proc~update_int64_3 proc~update_int8_2 array_hash_t%update_int8_2 none~update->proc~update_int8_2 proc~update_int8_3 array_hash_t%update_int8_3 none~update->proc~update_int8_3 proc~update_logical_2 array_hash_t%update_logical_2 none~update->proc~update_logical_2 proc~update_logical_3 array_hash_t%update_logical_3 none~update->proc~update_logical_3 proc~update_rdp_2 array_hash_t%update_rdp_2 none~update->proc~update_rdp_2 proc~update_rdp_3 array_hash_t%update_rdp_3 none~update->proc~update_rdp_3 proc~update_rsp_2 array_hash_t%update_rsp_2 none~update->proc~update_rsp_2 proc~update_rsp_3 array_hash_t%update_rsp_3 none~update->proc~update_rsp_3 proc~hash_cdp_1 hash_cdp_1 proc~hash_cdp_1->none~update proc~hash_cdp_2 hash_cdp_2 proc~hash_cdp_2->none~update proc~hash_cdp_3 hash_cdp_3 proc~hash_cdp_3->none~update proc~hash_char_0 hash_char_0 proc~hash_char_0->none~update proc~hash_char_1 hash_char_1 proc~hash_char_1->none~update proc~hash_csp_1 hash_csp_1 proc~hash_csp_1->none~update proc~hash_csp_2 hash_csp_2 proc~hash_csp_2->none~update proc~hash_csp_3 hash_csp_3 proc~hash_csp_3->none~update proc~hash_int16_1 hash_int16_1 proc~hash_int16_1->none~update proc~hash_int16_2 hash_int16_2 proc~hash_int16_2->none~update proc~hash_int16_3 hash_int16_3 proc~hash_int16_3->none~update proc~hash_int32_1 hash_int32_1 proc~hash_int32_1->none~update proc~hash_int32_2 hash_int32_2 proc~hash_int32_2->none~update proc~hash_int32_3 hash_int32_3 proc~hash_int32_3->none~update proc~hash_int64_1 hash_int64_1 proc~hash_int64_1->none~update proc~hash_int64_2 hash_int64_2 proc~hash_int64_2->none~update proc~hash_int64_3 hash_int64_3 proc~hash_int64_3->none~update proc~hash_int8_1 hash_int8_1 proc~hash_int8_1->none~update proc~hash_int8_2 hash_int8_2 proc~hash_int8_2->none~update proc~hash_int8_3 hash_int8_3 proc~hash_int8_3->none~update proc~hash_logical_1 hash_logical_1 proc~hash_logical_1->none~update proc~hash_logical_2 hash_logical_2 proc~hash_logical_2->none~update proc~hash_logical_3 hash_logical_3 proc~hash_logical_3->none~update proc~hash_rdp_1 hash_rdp_1 proc~hash_rdp_1->none~update proc~hash_rdp_2 hash_rdp_2 proc~hash_rdp_2->none~update proc~hash_rdp_3 hash_rdp_3 proc~hash_rdp_3->none~update proc~hash_rsp_1 hash_rsp_1 proc~hash_rsp_1->none~update proc~hash_rsp_2 hash_rsp_2 proc~hash_rsp_2->none~update proc~hash_rsp_3 hash_rsp_3 proc~hash_rsp_3->none~update proc~soa_hash_begin_32 soa_hash_begin_32 proc~soa_hash_begin_32->none~update proc~soa_hash_int32_field soa_hash_int32_field proc~soa_hash_int32_field->none~update proc~soa_hash_int64_field soa_hash_int64_field proc~soa_hash_int64_field->none~update proc~soa_hash_logical_field soa_hash_logical_field proc~soa_hash_logical_field->none~update proc~soa_hash_real_dp_field soa_hash_real_dp_field proc~soa_hash_real_dp_field->none~update proc~soa_hash_real_sp_field soa_hash_real_sp_field proc~soa_hash_real_sp_field->none~update proc~update_cdp_2->none~update proc~update_cdp_3->none~update proc~update_char_1->none~update proc~update_csp_2->none~update proc~update_csp_3->none~update proc~update_int16_2->none~update proc~update_int16_3->none~update proc~update_int32_2->none~update proc~update_int32_3->none~update proc~update_int64_2->none~update proc~update_int64_3->none~update proc~update_int8_2->none~update proc~update_int8_3->none~update proc~update_logical_2->none~update proc~update_logical_3->none~update proc~update_rdp_2->none~update proc~update_rdp_3->none~update proc~update_rsp_2->none~update proc~update_rsp_3->none~update interface~array_hash array_hash interface~array_hash->proc~hash_cdp_1 interface~array_hash->proc~hash_cdp_2 interface~array_hash->proc~hash_cdp_3 interface~array_hash->proc~hash_char_0 interface~array_hash->proc~hash_char_1 interface~array_hash->proc~hash_csp_1 interface~array_hash->proc~hash_csp_2 interface~array_hash->proc~hash_csp_3 interface~array_hash->proc~hash_int16_1 interface~array_hash->proc~hash_int16_2 interface~array_hash->proc~hash_int16_3 interface~array_hash->proc~hash_int32_1 interface~array_hash->proc~hash_int32_2 interface~array_hash->proc~hash_int32_3 interface~array_hash->proc~hash_int64_1 interface~array_hash->proc~hash_int64_2 interface~array_hash->proc~hash_int64_3 interface~array_hash->proc~hash_int8_1 interface~array_hash->proc~hash_int8_2 interface~array_hash->proc~hash_int8_3 interface~array_hash->proc~hash_logical_1 interface~array_hash->proc~hash_logical_2 interface~array_hash->proc~hash_logical_3 interface~array_hash->proc~hash_rdp_1 interface~array_hash->proc~hash_rdp_2 interface~array_hash->proc~hash_rdp_3 interface~array_hash->proc~hash_rsp_1 interface~array_hash->proc~hash_rsp_2 interface~array_hash->proc~hash_rsp_3 interface~soa_hash_begin soa_hash_begin interface~soa_hash_begin->proc~soa_hash_begin_32 interface~soa_hash_field soa_hash_field interface~soa_hash_field->proc~soa_hash_int32_field interface~soa_hash_field->proc~soa_hash_int64_field interface~soa_hash_field->proc~soa_hash_logical_field interface~soa_hash_field->proc~soa_hash_real_dp_field interface~soa_hash_field->proc~soa_hash_real_sp_field proc~particle_soa_state_hash particle_soa_t%particle_soa_state_hash proc~particle_soa_state_hash->interface~soa_hash_begin proc~particle_soa_state_hash->interface~soa_hash_field proc~particle_soa_state_hash64 particle_soa_t%particle_soa_state_hash64 proc~particle_soa_state_hash64->interface~soa_hash_begin proc~particle_soa_state_hash64->interface~soa_hash_field

Variables

Type Visibility Attributes Name Initial
integer(kind=int64), private :: class_code
integer(kind=int64), private :: expo
integer(kind=int64), private :: mantissa
integer(kind=int64), private :: sign_code

Source Code

   pure subroutine feed_real_sp(state, value)
      !! Canonicalise and feed one `real(sp)` value.
      !!
      !! NaN is tested first, as the one value that is unordered with respect
      !! to zero: neither `value >= 0` nor `value <= 0` holds. That ordered
      !! form is used in preference to the more familiar `value /= value`
      !! because it says the same thing without an equality test on a real,
      !! which every compiler warns about. Infinities are then separated from
      !! finite values by comparison against `huge`, so that `exponent` and
      !! `fraction` are only ever applied to a finite, non-zero argument, and
      !! zero is finally detected as the value that is not greater than zero in
      !! magnitude -- which is true for -0.0 as well as +0.0, and is where the
      !! two signed zeroes become one.
      integer(int32), intent(inout) :: state
      real(sp), intent(in) :: value
         !! Value to encode; may be any value including -0.0, NaN and +/-Inf.

      integer(int64) :: class_code, sign_code, expo, mantissa

      sign_code = 0_int64
      expo = 0_int64
      mantissa = 0_int64
      if (.not. (value >= 0.0_sp .or. value <= 0.0_sp)) then
         class_code = CLASS_NAN
      else if (value > huge(value)) then
         class_code = CLASS_POS_INF
      else if (value < -huge(value)) then
         class_code = CLASS_NEG_INF
      else if (.not. (abs(value) > 0.0_sp)) then
         class_code = CLASS_ZERO
      else
         class_code = CLASS_FINITE
         if (value < 0.0_sp) sign_code = 1_int64
         expo = int(exponent(value), int64)
         mantissa = int(scale(fraction(abs(value)), digits(value)), int64)
      end if
      call feed_real_record(state, class_code, sign_code, expo, mantissa)
   end subroutine feed_real_sp