2016-11-18 4 views
2

При работе с tcl я обнаруживаю такое поведение: когда я перебираю двойную переменную, она теряет свою точность.Двойные значения теряют точность в tcl после операции string list

set dbl [expr { double(13.0/7.0) }] 
set dbl2 [expr { double(13.0/7.0) }] 
foreach a $dbl { 
} 
if { $dbl == $dbl2 } { 
    puts "\$dbl == \$dbl2" 
} else { 
    puts "\$dbl != \$dbl2" ;# they will be not equal 
} 

Как скоро я узнать, когда вы используете операции, которые работают со строками или списков (например, llength, Lindex, струнный первый, rsub, Еогеасп и т.д.) двойное представление переменной будет заменено строковое представление который будет создан или был создан ранее, на основе значения $tcl_precision. Кроме того, каждая копия этой двойной переменной, созданная командой set, также будет испорчена.

Есть ли способ не потерять точность после таких операций в tcl8.4 и без принуждения tcl_precision к некоторому фиксированному значению?

P.S. set tcl_precision 0 будет работать только в версиях tcl8.5 или выше.

ответ

3

От Tcl 8.5 и далее ваш код должен работать просто. Значительные усилия были внесены в 8.5, чтобы сделать преобразование по умолчанию double s в строки (и, следовательно, на другие типы), чтобы не потерять информацию. Он также пытается использовать минимальное количество цифр для этого на том основании, что это минимизирует количество сюрпризов, представленных людям; да, у нас был настоящий эксперт, работающий над этим.

Для 8.4 и ранее установите tcl_precision на 17. Это гарантирует отсутствие значительных бит, хотя используемое представление может быть значительно длиннее минимального.

Смежные вопросы