FloatToStr

Тема в разделе "WASM.ASSEMBLER", создана пользователем cresta, 14 апр 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1.     result  dq 1249992.3
    2.     Buff db 32 dup(0)
    3. .code
    4.     invoke FloatToStr,qword ptr[result],addr Buff




    Ожидаю увидеть в буфере 1249992.3, но почему-то имею 1249992. Куда девается дробная часть? Судя по описанию, дробная часть должна была присутствовать...


    Код (Text):
    1. ; If the value is an integer of less than 16 digits, we convert it to
    2. ; an integral value.
    3. ;
    4. ; [b]If the value is between 0.1 and 9999999.0, we convert it to a decimal[/b]
    5. ; value.
    6. ;
    7. ; Otherwise, we convert it to a scientific notation with 1 digit
    8. ; left and up to 6 digits right of the decimal, with a 3 digit exponent:
    9. ;    9.999999E+999




    Или я что-то не так понял?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ты где эту функцию-то откапал?
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    в пакете masm32.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cresta

    Тело в студию :)
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Чьё тело в студию ???



    На всякий случай тело функции:



    [​IMG] 2034655702__FPTOA.ASM
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (Text):
    1. .if (dword ptr [fpin] == 0) && (dword ptr [fpin][4] == 0)


    Смотрите, дети, это АССЕМБЛЕР!

    Воротит от макросов.



    Что это за извратный способ? Зачем это ему понадобилось FloatToBCD?..
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    330 строк тяжеловато быстро разобрать. Мой FloatToStr был < 100. Сам в коде капался?
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Копался, пока на PowerOf10 не наткнулся. Что за ф-ция - не знаю. И описания нет.
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cresta



    Надо найти :)
     
  10. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Да посмотри ты наш FPU_work и не парься.
     
  11. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    хотя щас сам посмотрел, коряво написано.

    Но считать удобно :)
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Тут мне вот этот кусок не нравится:


    Код (Text):
    1. ; We use the format [-]d.ddddddE+ddd.  That means we only need a maximum
    2. ; of 7 decimal places.  Let's have fbstp do our rounding for us.
    3.  
    4.     mov eax, 6
    5.     sub eax, [iExp] ; adjust exponent to 7
    6.     call PowerOf10




    зачем-то тут решили, что формат d.ddddddE+ddd и чего-то округляется этой самой PowerOf10.



    Вообще я понял, править код бесполезно, ф-ция сама-то в либе, я ж либу не переделаю :dntknw: А без PowerOf10 даже скопировать к себе не получится. PowerOf10 в либе вроде есть, но на экспорт не идёт. Вызывается изнутри либы...
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    yureckor



    Я видел эту реализацию, но там же вроде через строки всё делается. Конечно проще, но не очень удобно: данные - qword, надо переводить в строки, затем в FPU_work наверняка обратно в qword, обработка и обратно в строку, а по получении результата надо опять в qword :dntknw:

    А FloatToStr - это вспомогательная ф-ция.
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cresta



    Тебе именно экспоненциальное представление надо?
     
  15. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    _DEN_

    пока разглядывал PowerOf10, нашел _FloatToStr2@12

    Ещё одна ф-ция. И работает :) До +Е17 выводит децимальное и не отрезает, а выше - scientific.

    А среди исходников почему-то её нет.
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cresta

    Так ее и юзай :)
     
  17. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    на всякий случай: не знаю как во float2str - не добрался, а вот в наоборот в пакете масма ошибка есть - они в своей таблице степеней десятки часть пропустили, но это имеет значение только для dt
     
  18. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Да бывают у них ошибки, например a2dw не работает, а atodw - нормально. Надо будет FloatToStr2 тоже попроверять.

    Спасибо всем.