Package reflectometry :: Package reduction :: Module formatnum

Source Code for Module reflectometry.reduction.formatnum

  1  # This program is public domain 
  2  """ 
  3  Format numbers nicely for printing. 
  4  """ 
  5   
  6  import math 
  7  __all__ = ['format_uncertainty'] 
  8   
9 -def format_uncertainty(value,uncertainty):
10 """ 11 Given a value and an uncertainty, return a concise string representation. 12 13 The returned string uses only the number of digits warranted by the 14 uncertainty in the measurement. 15 """ 16 if uncertainty == None: 17 return "%g"%value 18 19 # Process sign 20 sign = "-" if value < 0 else "" 21 value = abs(value) 22 23 # Represent error as (##) at the end of the digit string 24 val_place = int(math.floor(math.log10(value))) 25 err_place = int(math.floor(math.log10(uncertainty))) 26 err_str = "(%2d)"%int(uncertainty/10.**(err_place-1)+0.5) 27 28 if err_place > val_place: 29 # Degenerate case: error bigger than value 30 # The mantissa is 0.#(##)e#, 0.0#(##)e# or 0.00#(##)e# 31 if err_place - val_place > 2: value = 0 32 val_place = int(math.floor((err_place+2)/3.))*3 33 digits_after_decimal = val_place - err_place + 1 34 val_str = "%.*f%s"%(digits_after_decimal,value/10.**val_place,err_str) 35 if val_place != 0: val_str += "e%d"%val_place 36 elif err_place == val_place: 37 # Degenerate case: error and value the same order of magnitude 38 # The value is ##(##)e#, #.#(##)e# or 0.##(##)e# 39 val_place = int(math.floor((err_place+1)/3.))*3 40 digits_after_decimal = val_place - err_place + 1 41 val_str = "%.*f%s"%(digits_after_decimal,value/10.**val_place,err_str) 42 if val_place != 0: val_str += "e%d"%val_place 43 elif err_place <= 1 and val_place >= -3: 44 # Normal case: nice numbers and errors 45 # The value is ###.###(##) 46 digits_after_decimal = abs(err_place-1) 47 val_str = "%.*f%s"%(digits_after_decimal,value,err_str) 48 else: 49 # Extreme cases: zeros before value or after error 50 # The value is ###.###(##)e#, ##.####(##)e# or #.#####(##)e# 51 total_digits = val_place - err_place + 2 52 val_place = int(math.floor(val_place/3.))*3 53 val_str = "%.*g%se%d"%(total_digits, 54 value/10.**val_place, 55 err_str,val_place) 56 57 return sign+val_str
58 59
60 -def test():
61 value_str = format_uncertainty # Changed name after testing 62 63 # val_place > err_place 64 assert value_str(1235670,766000) == "1.24(77)e6" 65 assert value_str(123567.,76600) == "124(77)e3" 66 assert value_str(12356.7,7660) == "12.4(77)e3" 67 assert value_str(1235.67,766) == "1.24(77)e3" 68 assert value_str(123.567,76.6) == "124(77)" 69 assert value_str(12.3567,7.66) == "12.4(77)" 70 assert value_str(1.23567,.766) == "1.24(77)" 71 assert value_str(.123567,.0766) == "0.124(77)" 72 assert value_str(.0123567,.00766) == "0.0124(77)" 73 assert value_str(.00123567,.000766) == "0.00124(77)" 74 assert value_str(.000123567,.0000766) == "124(77)e-6" 75 assert value_str(.0000123567,.00000766) == "12.4(77)e-6" 76 assert value_str(.00000123567,.000000766) == "1.24(77)e-6" 77 assert value_str(.000000123567,.0000000766) == "124(77)e-9" 78 assert value_str(.00000123567,.0000000766) == "1.236(77)e-6" 79 assert value_str(.0000123567,.0000000766) == "12.357(77)e-6" 80 assert value_str(.000123567,.0000000766) == "123.567(77)e-6" 81 assert value_str(.00123567,.000000766) == "0.00123567(77)" 82 assert value_str(.0123567,.00000766) == "0.0123567(77)" 83 assert value_str(.123567,.0000766) == "0.123567(77)" 84 assert value_str(1.23567,.000766) == "1.23567(77)" 85 assert value_str(12.3567,.00766) == "12.3567(77)" 86 assert value_str(123.567,.0764) == "123.567(76)" 87 assert value_str(1235.67,.764) == "1235.67(76)" 88 assert value_str(12356.7,7.64) == "12356.7(76)" 89 assert value_str(123567,76.4) == "123567(76)" 90 assert value_str(1235670,764) == "1.23567(76)e6" 91 assert value_str(12356700,764) == "12.3567(76)e6" 92 assert value_str(123567000,7640) == "123.567(76)e6" 93 assert value_str(1235670000,76400) == "1.23567(76)e9" 94 95 # val_place == err_place 96 assert value_str(123567,764000) == "0.12(76)e6" 97 assert value_str(12356.7,76400) == "12(76)e3" 98 assert value_str(1235.67,7640) == "1.2(76)e3" 99 assert value_str(123.567,764) == "0.12(76)e3" 100 assert value_str(12.3567,76.4) == "12(76)" 101 assert value_str(1.23567,7.64) == "1.2(76)" 102 assert value_str(.123567,.764) == "0.12(76)" 103 assert value_str(.0123567,.0764) == "12(76)e-3" 104 assert value_str(.00123567,.00764) == "1.2(76)e-3" 105 assert value_str(.000123567,.000764) == "0.12(76)e-3" 106 107 # val_place == err_place-1 108 assert value_str(123567,7640000) == "0.1(76)e6" 109 assert value_str(12356.7,764000) == "0.01(76)e6" 110 assert value_str(1235.67,76400) == "0.001(76)e6" 111 assert value_str(123.567,7640) == "0.1(76)e3" 112 assert value_str(12.3567,764) == "0.01(76)e3" 113 assert value_str(1.23567,76.4) == "0.001(76)e3" 114 assert value_str(.123567,7.64) == "0.1(76)" 115 assert value_str(.0123567,.764) == "0.01(76)" 116 assert value_str(.00123567,.0764) == "0.001(76)" 117 assert value_str(.000123567,.00764) == "0.1(76)e-3" 118 119 # val_place == err_place-2 120 assert value_str(12356700,7640000000) == "0.0(76)e9" 121 assert value_str(1235670,764000000) == "0.00(76)e9" 122 assert value_str(123567,76400000) == "0.000(76)e9" 123 assert value_str(12356,7640000) == "0.0(76)e6" 124 assert value_str(1235,764000) == "0.00(76)e6" 125 assert value_str(123,76400) == "0.000(76)e6" 126 assert value_str(12,7640) == "0.0(76)e3" 127 assert value_str(1,764) == "0.00(76)e3" 128 assert value_str(0.1,76.4) == "0.000(76)e3" 129 assert value_str(0.01,7.64) == "0.0(76)" 130 assert value_str(0.001,0.764) == "0.00(76)" 131 assert value_str(0.0001,0.0764) == "0.000(76)" 132 assert value_str(0.00001,0.00764) == "0.0(76)e-3" 133 134 # val_place == err_place-3 135 assert value_str(12356700,76400000000) == "0.000(76)e12" 136 assert value_str(1235670,7640000000) == "0.0(76)e9" 137 assert value_str(123567,764000000) == "0.00(76)e9" 138 assert value_str(12356,76400000) == "0.000(76)e9" 139 assert value_str(1235,7640000) == "0.0(76)e6" 140 assert value_str(123,764000) == "0.00(76)e6" 141 assert value_str(12,76400) == "0.000(76)e6" 142 assert value_str(1,7640) == "0.0(76)e3" 143 assert value_str(0.1,764) == "0.00(76)e3" 144 assert value_str(0.01,76.4) == "0.000(76)e3" 145 assert value_str(0.001,7.64) == "0.0(76)" 146 assert value_str(0.0001,0.764) == "0.00(76)" 147 assert value_str(0.00001,0.0764) == "0.000(76)" 148 assert value_str(0.000001,0.00764) == "0.0(76)e-3" 149 150 # negative values 151 assert value_str(-1235670,765000) == "-1.24(77)e6" 152 assert value_str(-1.23567,.765) == "-1.24(77)" 153 assert value_str(-.00000123567,.0000000765) == "-1.236(77)e-6" 154 assert value_str(-12356.7,7.64) == "-12356.7(76)" 155 assert value_str(-123.567,764) == "-0.12(76)e3" 156 assert value_str(-1235.67,76400) == "-0.001(76)e6" 157 assert value_str(-.000123567,.00764) == "-0.1(76)e-3" 158 assert value_str(-12356,7640000) == "-0.0(76)e6" 159 assert value_str(-12,76400) == "-0.000(76)e6" 160 assert value_str(-0.0001,0.764) == "-0.00(76)"
161 162 163 if __name__ == "__main__": test() 164