桁数のコントロールについて¶
指数部と仮数部の分離¶
def mantissa_and_exponent( value ):
import math
if ( value == 0 ):
return( 0, 0 )
else:
exponent = math.floor( math.log10( abs( value ) ) )
mantissa = value / ( 10**exponent )
return( mantissa, exponent )
# ========================================================= #
# === Execution of Pragram === #
# ========================================================= #
if ( __name__=="__main__" ):
print( mantissa_and_exponent( 1.38e23 ) )
または、指数部だけなら、ワンライナー
exp = math.floor( np.log10( abs( value ) ) ) if ( value != 0 ) else 0.0
PHITSへの入力など文字列で数値出力時に、桁を揃える¶
import math, decimal
def return__digitsAligned( value, maxDigit=10, precision=12 ):
decimal.getcontext().prec = precision
exp = math.floor( math.log10( abs( value ) ) ) if ( value != 0 ) else 0.0
if ( abs( exp ) >= maxDigit ):
ret = "{:15.8e}".format( value )
else:
ret = str( decimal.Decimal( round( value, maxDigit ) ).normalize() )
return( ret )
# ========================================================= #
# === Execution of Pragram === #
# ========================================================= #
if ( __name__=="__main__" ):
print( return__digitsAligned( 1.602e-19 ) )
print( return__digitsAligned( 1.602e-6 ) )
print( return__digitsAligned( 0.92229 ) )
print( return__digitsAligned( 1.02e+8 ) )
PHITSなど、文字列で入力ファイルを作る際には、桁が異なる2数の和・差を求めると、異なる値になりえる.
例えば、x0=1.111 の位置から、dx=0.01234 の円柱を伸ばすような命令を連続して3本生やす.
共に、有効数字は4桁 だが、最低桁の指数が異なる.
考えている動作
1本目 [ 1.111 - 1.124 ]
2本目 [ 1.124 - 1.136 ]
3本目 [ 1.136 - 1.148 ]
実際、命令を書いたとき、
1本目 [ 1.111 - 1.12434 ]
2本目 [ 1.124 - 1.13668 ]
3本目 [ 1.136 - 1.14902 ]
dx と、各x0の桁数が異なることが問題.
上記の桁数を合わせる命令で.例えば、最小桁は10桁目、までと合わせるのがよい.
指数表示の際は、これが適用されないことに注意.