桁数のコントロールについて

指数部と仮数部の分離


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桁目、までと合わせるのがよい.

  • 指数表示の際は、これが適用されないことに注意.