Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.182.45] |
|
Сообщ.
#1
,
|
|
|
Есть микроконтроллер xMega256A3U, есть код, работающий параллельно и в микроконтроллере и на ПК, и есть необходимость получения идентичных результатов и на ПК и в МК. Код состоит из сумм произведений чисел типа float. И если произведения float'ов получаются идентичными, во всяком случае расхождений пока не было замечено, то суммирование выполняется с ошибкой. Например, при суммировании трех чисел x1 = 2.0892078876495361328125E0 (0x95B50540), x2 = 2.0224435329437255859375E0 (0xB76F0140), х3 = 1.96428620815277099609375E0 (0xBB6DFB3F) в ПК получается результат 6.075937747955322265625E0 (0x156EC240), а в МК - 6.0759372711181640625E0 (0x146EC240). И если кажется, что разница не велика, то опять же скажу, что вычислений много, они рекурсивные и ошибки быстро накапливаются, к тому же хотелось бы получить идентичные результаты. Программа на ПК исполнялась в Delphi, но также проверялась в Dev-C++ - результаты идентичны. Код для МК также проверялся в Keil'е где эмулировался Intel 8052A и результаты такие же как в xMega. Мои подозрения в том, что в xMega и Intel числа представляются как Big endian, а в ПК little endian, однако как это проверить, а главное как это поправить, - не ясно. Может кто-нибудь сталкивался с такой проблемой? Буду признателен за любую помощь.
|
Сообщ.
#2
,
|
|
|
Судя по приведённым кодам, представление используется одинаковое. Отличие наблюдается в самом младшем бите результата (кстати для float незачем выводить больше 8 значащих цифр - в остальных мусор).
Скорее всего, округление результата по разному производится. Одна из возможных причин. На МК скорее всего вычисления производятся непосредственно в формате float. На ПК для уменьшения влияния округления промежуточные результаты могут храниться в формате long double. |
Сообщ.
#3
,
|
|
|
Да, точно!
Проверил При x = x1 + x2 + x3; (15 6e c2 40) При x = x1 + x2; x = x + x3; (14 6e c2 40) Я вроде подобный вариант проверял раньше, но видимо сделал не внимательно. Спасибо! |