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)