Код (Text): result dq 1249992.3 Buff db 32 dup(0) .code invoke FloatToStr,qword ptr[result],addr Buff Ожидаю увидеть в буфере 1249992.3, но почему-то имею 1249992. Куда девается дробная часть? Судя по описанию, дробная часть должна была присутствовать... Код (Text): ; If the value is an integer of less than 16 digits, we convert it to ; an integral value. ; ; [b]If the value is between 0.1 and 9999999.0, we convert it to a decimal[/b] ; value. ; ; Otherwise, we convert it to a scientific notation with 1 digit ; left and up to 6 digits right of the decimal, with a 3 digit exponent: ; 9.999999E+999 Или я что-то не так понял?
Код (Text): .if (dword ptr [fpin] == 0) && (dword ptr [fpin][4] == 0) Смотрите, дети, это АССЕМБЛЕР! Воротит от макросов. Что это за извратный способ? Зачем это ему понадобилось FloatToBCD?..
Тут мне вот этот кусок не нравится: Код (Text): ; We use the format [-]d.ddddddE+ddd. That means we only need a maximum ; of 7 decimal places. Let's have fbstp do our rounding for us. mov eax, 6 sub eax, [iExp] ; adjust exponent to 7 call PowerOf10 зачем-то тут решили, что формат d.ddddddE+ddd и чего-то округляется этой самой PowerOf10. Вообще я понял, править код бесполезно, ф-ция сама-то в либе, я ж либу не переделаю А без PowerOf10 даже скопировать к себе не получится. PowerOf10 в либе вроде есть, но на экспорт не идёт. Вызывается изнутри либы...
yureckor Я видел эту реализацию, но там же вроде через строки всё делается. Конечно проще, но не очень удобно: данные - qword, надо переводить в строки, затем в FPU_work наверняка обратно в qword, обработка и обратно в строку, а по получении результата надо опять в qword А FloatToStr - это вспомогательная ф-ция.
_DEN_ пока разглядывал PowerOf10, нашел _FloatToStr2@12 Ещё одна ф-ция. И работает До +Е17 выводит децимальное и не отрезает, а выше - scientific. А среди исходников почему-то её нет.
на всякий случай: не знаю как во float2str - не добрался, а вот в наоборот в пакете масма ошибка есть - они в своей таблице степеней десятки часть пропустили, но это имеет значение только для dt
Да бывают у них ошибки, например a2dw не работает, а atodw - нормально. Надо будет FloatToStr2 тоже попроверять. Спасибо всем.