Source code for hyloa.utils.err_format

# This file is part of HYLOA - HYsteresis LOop Analyzer.
# Copyright (C) 2024 Francesco Zeno Costanzo

# HYLOA is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# HYLOA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with HYLOA. If not, see <https://www.gnu.org/licenses/>.

"""
Code to ensure correct print format for error
"""
import numpy as np


[docs] def format_value_error(val, err): ''' A function that returns the formatting of the measurement with error in the form: value(error). Therefore, the error refers to the last digit of the value. Only one significant digit for the error is displayed. If the error is smalle than 1e-3 or bigger 1e3 the scientific notation will be used. Parameters ---------- val : float central values err : float error associated to val Return ------ string Examples -------- >>> print(format_value_error(1.234598, 0.01631) 1.23(2) >>> print(format_value_error(1234.523, 12.0) 1235(12) >>> print(format_value_error(12300000.0 ± 340000.0) 1.23(3)e7 >>> print(format_value_error(5.6e-05, 1.2e-06) 5.6(1)e-5 ''' # Division between mantissa and exponent for error exp = int(np.log10(err)) mant = err / 10**exp # Scientific notation for error bigger than 1e3 and smoller than 1e-3 if abs(exp) >= 3: # Division between mantissa and exponent for central value exp_val = int(np.log10(abs(val)) if val != 0 else 0) scale = 10**exp_val mant_val = val / scale # Ensures correct formatting if mant_val < 1: exp_val -= 1 scale /= 10 mant_val *= 10 elif mant_val >= 10: exp_val += 1 scale *= 10 mant_val /= 10 # Sacle the error err_scaled = err / scale exp_err = int(np.log10(err_scaled)) mant_err = err_scaled / 10**(exp_err) # Ensures correct formatting if mant_err < 1: exp_err -= 1 # Update mantissa will be correct but not necessary elif mant_err >= 10: exp_err += 1 # Number of significant digits to display sig_dig = 1 # Dacimal for rounding to sig_dig digits decimals = max(0, -exp_err -1 + sig_dig) err_int = int(round(err_scaled * 10**decimals)) mant_val = round(mant_val, decimals) val_str = f"{mant_val:.{decimals}f}" return f"{val_str}({err_int})e{exp_val}" # Ensures correct formatting if mant < 1.0: exp -= 1 # Update mantissa will be correct but not necessary elif mant >= 10.0: exp += 1 # Number of significant digits to display sig_dig = 1 # Dacimal for rounding to sig_dig digits decimals = max(0, -exp - 1 + sig_dig) err_rounded = round(err, decimals) val_rounded = round(val, decimals) err_int = int(round(err_rounded * 10**decimals)) val_str = f"{val_rounded:.{decimals}f}" return f"{val_str}({err_int})"