% expr 60.9-59.7
1.1999999999999957
по умолчанию Похоже, что в приведенном выше примере expr
выводит результат операции с плавающей точкой в более высокой точности, что он вычисляет.Управление выходной точности арифметики с плавающей точкой в TCL
Для чего-то что просто я бы ожидать более разумный выход, такие как выход этой C++ код:
#include <iostream>
int main()
{
double a = 60.9;
a -= 59.7;
std::cout << "double a = " << a << std::endl;
float b = 60.9;
b -= 59.7;
std::cout << "float b = " << b << std::endl;
}
Выходные:
double a = 1.2
float b = 1.2
Таким образом, вопросы:
Почему TCL выводит результат expr
в более высокую точность, чем он их вычисляет, тем самым вызывая артефакты lsb?
Можно ли предотвратить эту пародию, возможно, установив что-то вроде переменной глобальной переменной или глобальной переменной разрешения вывода или что-то в этом роде?
Это просто потому, что в C и C++ точность по умолчанию равна 6, поэтому после округления до 6 десятичных цифр, 1.1999999 ... станет 1.2. Это не потому, что tcl вычисляет более высокую точность –