import sys
from mathlib import add, multiply, divide, root_n, subtract
from errors import DomainError


## @brief Parses whitespace-separated floats from standard input.
# @yield float Each number read from the input stream.
def read_numbers_from_stdin():
    for token in sys.stdin.buffer.read().split():
        yield float(token)


## @brief Computes the sample standard deviation of an iterable of numbers.
# @param values Sequence of numeric values.
# @return Sample standard deviation.
# @throws DomainError If input contains fewer than 2 numbers or if variance becomes negative.
def calculate_sample_stddev(values):
    count = 0
    sum_values = 0.0
    sum_squares = 0.0

    for x in values:
        count = add(count, 1)
        sum_values = add(sum_values, x)
        sum_squares = add(sum_squares, multiply(x, x))

    if count < 2:
        raise DomainError("stddev: need at least 2 numbers")

    mean = divide(sum_values, count)
    mean = multiply(mean, mean)
    count_mean = multiply(count, mean)
    numerator = subtract(sum_squares, count_mean)
    variance = divide(numerator, count - 1)

    if variance < 0 and abs(variance) < 1e-12:
        variance = 0.0
    if variance < 0:
        raise DomainError("stddev: variance became negative (numerical issue)")

    return root_n(variance, 2)

## @brief CLI entry point: reads input, computes stddev, handles errors.
# @return 0 on success, 1 on error.
# @details Prints result to stdout, errors to stderr. Exits cleanly via SystemExit.
def main():
    try:
        value = calculate_sample_stddev(read_numbers_from_stdin())
        sys.stdout.write(f"{value}\n")
    except Exception as e:
        sys.stderr.write(str(e) + "\n")
        return 1
    return 0


if __name__ == "__main__":
    raise SystemExit(main())