Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2016, 12:53   #1
Мордохвост
Пользователь
 
Регистрация: 15.04.2015
Сообщений: 30
По умолчанию Строка в Float - контроль четности?

Привет!
Вообщем Delphi пропарсил строку и сделал мне double. И я беру ту же строку и получаю double. Способ мой коротко вот:
Код:
@@single:
  movzx     eax,word ptr [r8] //r8 - указатель на WideChar
  sub       eax,$00000030     
  cvtsi2sd  xmm1,eax
  mulsd     xmm0,xmm2         //xmm2 = 10.0
  addsd     xmm0,xmm1
  add       r8,2
  sub       ecx,1
  jz        @@isend

@@pair:
  mov       eax,[r8]             //сразу два
  sub       eax,$00300030
  movzx     edx,ax
  lea       edx,[edx+edx*4]
  add       edx,edx
  shr       eax,16
  add       eax,edx
  cvtsi2sd  xmm1,eax      
  mulsd     xmm0,xmm3         //xmm3 = 100.0
  addsd     xmm0,xmm1
  add       r8,4
  sub       ecx,2
  jg        @@pair
  ... затем коррекция нужной экспы и Power10 и т.д. и т.п.
Затем я сравниваю эти 2 double-а и они не равны! Проваливается на инструкции jp(контроль четности?). И реально: если бинарно смотреть у меня даблы отличаются на один последний бит. На коротких числах jp инструкция пропускает ещё(бинарно равны), но уже на длинных где там 20 цифр или 30 переумножишь/сложишь последний бит не совпадает и jp не пускает Обрабытывал все 100% цифр так же как и дельфин.

Как урегулировать, чтобы мои флоатки были таки эквивалентны делфийским? Есть какой-то регистр msxcr, но он каждый раз меняется после любой операции....
Мордохвост вне форума Ответить с цитированием
Старый 14.02.2016, 13:15   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

че-то не понял. ты сделал копипаст кода из какой-то библиотеки (делфи) и копипаст дает результат отличный от оригинала?
f.hump вне форума Ответить с цитированием
Старый 14.02.2016, 13:20   #3
Мордохвост
Пользователь
 
Регистрация: 15.04.2015
Сообщений: 30
По умолчанию

Не, это мой код. И результат не совпадает(сравнивая с делфи)
Мордохвост вне форума Ответить с цитированием
Старый 14.02.2016, 13:47   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

не совпадает на 1 бит? для длинных чисел так, что у дабла емкости не хватает, чтобы хранить мантиссу во всех подробностях и приходится округлять?

я бы не назвал это отличием.
ну, если хочешь можешь перед счетом добавить что-то типа

Код:
    STMXCSR DWORD PTR [rsp-8]
    OR DWORD PTR [rsp-8], 06000h
    LDMXCSR DWORD PTR [rsp-8]

Последний раз редактировалось f.hump; 14.02.2016 в 13:49.
f.hump вне форума Ответить с цитированием
Старый 14.02.2016, 15:55   #5
Мордохвост
Пользователь
 
Регистрация: 15.04.2015
Сообщений: 30
По умолчанию

f.hump, повлияло, но вообще катастрофа мой код.

Допустим "-5.722234971514055711914e+200"

Delphi: 0E99DE70F044FBE0C (не знаю сколько он цифр у себя максимально обрабатывает, вроде 18 т.е. все до красных)
Мой: 0E99DE70F044FBE08 (если также макс 18 цифр)
Мой: 0E99DE70F044FBE06 (если макс 36 цифр т.е. красные тоже будет считать)
И это с ldmxcsr or $06000

ок дойду до этого регистра уан дэй
Мордохвост вне форума Ответить с цитированием
Старый 14.02.2016, 16:06   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

мои мысли были про то, что возможно метод округления повлиял на результат.

биты 13 и 14 MXCSR определяют метод округления

00 - до ближайшейго
01 - до меньшего
10 - до большего
11 - до меньшего по абсолютному значению

но, с другой стороны метод округления - глобальный параметр, и повлияет на все процедуры использующие SSE.

также разница может быть в том случае если методы Delphi испльзуют FPU, а не SSE

Последний раз редактировалось f.hump; 14.02.2016 в 16:18.
f.hump вне форума Ответить с цитированием
Старый 14.02.2016, 16:57   #7
Мордохвост
Пользователь
 
Регистрация: 15.04.2015
Сообщений: 30
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
но, с другой стороны метод округления - глобальный параметр, и повлияет на все процедуры использующие SSE.
Посмотрел оригинал, сохраняет, но затем переписывает, скопипастил, и кажется только 16 цифр обрабатывать надо.
Код:
  sub       rsp,16
  stmxcsr   [rsp]
  mov       dword ptr [rsp],$00001F80
  ldmxcsr   [rsp]

  ....конвертинг

@@done:
  mov       dword ptr [rsp],$00001900
  ldmxcsr   [rsp]
  add       rsp,16
Вооот, вернуло наконец-то мне индентичное. А на x64 там только sse. Клёво, больше не нужно учить этот регистр
Мордохвост вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строка в Float - как за время в 7 раз большее, чем просто пустой цикл Мордохвост Помощь студентам 3 03.08.2015 11:42
Конвертация single float в double float kypck Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 23.04.2012 00:22
Определение четности/нечетности Assemblerman Помощь студентам 11 25.08.2011 21:49
Ошибка типа cannot convert `float*' to `float' for argument `1' ... Trackman Помощь студентам 3 23.05.2011 17:09
FLOAT TO TRING И STRING TO FLOAT!! MelKiY_bad C++ Builder 6 07.05.2010 14:31