Canonicalise and feed one real(dp) value. See feed_real_sp for the
ordering of the classification tests.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=int32), | intent(inout) | :: | state | |||
| real(kind=dp), | intent(in) | :: | value |
Value to encode; may be any value including -0.0, NaN and +/-Inf. |
| 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 |
pure subroutine feed_real_dp(state, value) !! Canonicalise and feed one `real(dp)` value. See `feed_real_sp` for the !! ordering of the classification tests. integer(int32), intent(inout) :: state real(dp), 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_dp .or. value <= 0.0_dp)) 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_dp)) then class_code = CLASS_ZERO else class_code = CLASS_FINITE if (value < 0.0_dp) 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_dp