@float.exponent = $7F800000
@float.firstNaN = $7F800001
@float.halfsign = $40000000
@float.mantisa = $007FFFFF ; fixed, thanks revolution
@double.exponent = $7FF0000000000000
@double.firstNaN = $7FF0000000000001
@double.halfsign = $4000000000000000
@double.mantisa = $000FFFFFFFFFFFFF
@ext.exponent = $7FFF
@ext.halfsign = $4000
@ext.infinity = $8000000000000000
@ext.firstNaN = $8000000000000001
@ext.mantisa = $7FFFFFFFFFFFFFFF
struc dd [arg] {
if defined arg
. dd arg
else
match sign value,arg {
match =INF,value { . dd @float.exponent - (sign @float.halfsign - @float.halfsign) \\}
match =NaN,value { . dd @float.firstNaN - (sign @float.halfsign - @float.halfsign) \\}
match =NaN + variant,value { . dd @float.firstNaN - (sign @float.halfsign - @float.halfsign) + ((variant+1) and @float.mantisa) - 1 and (((variant+1) and @float.mantisa)/(((variant) and @float.mantisa)+1)) \\} \}
end if }
macro dd [arg] {
if defined arg
dd arg
else
match sign value,arg {
match =INF,value { dd @float.exponent - (sign @float.halfsign - @float.halfsign) \\}
match =NaN,value { dd @float.firstNaN - (sign @float.halfsign - @float.halfsign) \\}
match =NaN + variant,value { dd @float.firstNaN - (sign @float.halfsign - @float.halfsign) + ((variant+1) and @float.mantisa) - 1 and (((variant+1) and @float.mantisa)/(((variant) and @float.mantisa)+1)) \\} \}
end if }
struc dq [arg] {
if defined arg
. dq arg
else
match sign value,arg {
match =INF,value { . dq @double.exponent - (sign @double.halfsign - @double.halfsign) \\}
match =NaN,value { . dq @double.firstNaN - (sign @double.halfsign - @double.halfsign) \\}
match =NaN + variant,value { . dq @double.firstNaN - (sign @double.halfsign - @double.halfsign) + ((variant+1) and @double.mantisa) - 1 and (((variant+1) and @double.mantisa)/(((variant) and @double.mantisa)+1)) \\} \}
end if }
macro dq [arg] {
if defined arg
dq arg
else
match sign value,arg {
match =INF,value { dq @double.exponent - (sign @double.halfsign - @double.halfsign) \\}
match =NaN,value { dq @double.firstNaN - (sign @double.halfsign - @double.halfsign) \\}
match =NaN + variant,value { dq @double.firstNaN - (sign @double.halfsign - @double.halfsign) + ((variant+1) and @double.mantisa) - 1 and (((variant+1) and @double.mantisa)/(((variant) and @double.mantisa)+1)) \\} \}
end if }
struc dt [arg] {
if 1.0 eqtype arg
. dt arg
else
match sign value,arg {
label . tbyte
match =INF,value { dq @ext.infinity \\}
match =NaN,value { dq @ext.firstNaN \\}
match =NaN + variant,value { dq @ext.firstNaN + ((variant+1) and @ext.mantisa) - 1 and (((variant+1) and @ext.mantisa)/(((variant) and @ext.mantisa)+1)) \\}
dw @ext.exponent - (sign @ext.halfsign - @ext.halfsign) \}
end if }
macro dt [arg] {
if 1.0 eqtype arg
dt arg
else
match sign value,arg {
match =INF,value { dq @ext.infinity \\}
match =NaN,value { dq @ext.firstNaN \\}
match =NaN + variant,value { dq @ext.firstNaN + ((variant+1) and @ext.mantisa) - 1 and (((variant+1) and @ext.mantisa)/(((variant) and @ext.mantisa)+1)) \\}
dw @ext.exponent - (sign @ext.halfsign - @ext.halfsign) \}
end if }
this aproach has only 1 significant minus - when these data directives get something realy undefined they don`t signal error.
use case:
dd 1, 7.6, +INF, -INF, +NaN, -NaN,+NaN+-1,-NaN+1000000+7/2 shl 4
dq 1, 7.6, +INF, -INF, +NaN, -NaN,+NaN+-1,-NaN+1000000+7/2 shl 4
dt 7.6, +INF, -INF, +NaN, -NaN,+NaN+-1,-NaN+1000000+7/2 shl 4