BP7/Delphi16 RTL's error founded !

From
Boris Rudakov (2:5054/9.4)
To
All ()
Date
1996-07-28T19:36Z
Area
PERM.PROG
Hello All!

Фак, Борланд - это Борланд, что с него взять...
Хотя, основная багодельня - это подразделение сишников, на долю паскалистов там тоже перлов хватает.

Эта ошибка была найдена в коде преобразования Single/Double/Extended->ASCIIz, т.е. преобразования всех вещественных чисел акромя ихнего самопального Real (ix87).

Ошибка в алгоритме округления точно представимых разрядов, в С версии она отсутствует (не, я просто прусь).

Сначала они масштабируют число и вычисляют експоненту для наиболее удобоваримого представления. Далее, они переводят 18 точно представимых разрядов (мантиссу) в BCD и озадачиваются ее округлением до числа затребованных разрядов. Если это было возможно, масштабирование уже превратило число из нормализованного (<+/->1.<18dig><E+/-><exp>) в такое, где точка находится на месте. Им надо отбросить лишние дробные разряды.

Сишники поступили правильно - они начинают с самого последнего разряда и, накапливая перенос, бегут до последнего требуемого разряда. Там они анализируют перенос и буде он есть - продолжают коррекцию. "И это, знаети ли - правильноо".

Паскалисты делают почти так же, почти - они начинают округление/перенос с ПЕРВОГО ОТБРАСЫВАЕМОГО разряда. Итог: если мы имеем число 99.0049 и говорим, что хочем тока 2 знака после запятой, то в С варианте мы получим 99.01 (9 даст перенос, 4 превратится в 5, а 5 даст перенос 0->1), а в Паскалевском - 99.00, т.к. 4ка сама по себе не дает переноса. Исправить, или нуегонафиг ?

Впрочем, Сишный вариант еще хуже, но с другой точки зрения. Он невероятно громоздкий и сложный. Будет время - надо разобраться че же они в нем такого творят, но вместо одного получения степени 10^x в Pas варианте в С - цикл с 10^x, округление состоит из цикла с делением и взятием остатка, а все в месте раза в два длинее и сложнее BP. Win32 вариант и вовсе написан на С (ладно хоть без ООП), про эффективность лучше и не думать - волосы дыбом встанут.

Boris Rudakov,               Харлей Дебилсон
BBR

--- Be happy: BBR is looking at you !
 * Origin: АлкАголь малыми дозами безвреден в любых количествах (2:5054/9.4)