На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
  
    > Проблема с суммированием float
      Есть микроконтроллер 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, однако как это проверить, а главное как это поправить, - не ясно. Может кто-нибудь сталкивался с такой проблемой? Буду признателен за любую помощь.
        Судя по приведённым кодам, представление используется одинаковое. Отличие наблюдается в самом младшем бите результата (кстати для float незачем выводить больше 8 значащих цифр - в остальных мусор).
        Скорее всего, округление результата по разному производится.

        Одна из возможных причин. На МК скорее всего вычисления производятся непосредственно в формате float. На ПК для уменьшения влияния округления промежуточные результаты могут храниться в формате long double.
        Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
          Да, точно!
          Проверил
          При
          x = x1 + x2 + x3; (15 6e c2 40)

          При
          x = x1 + x2; x = x + x3; (14 6e c2 40)

          Я вроде подобный вариант проверял раньше, но видимо сделал не внимательно. Спасибо!
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script Execution time: 0,0573 ]   [ 17 queries used ]   [ Generated: 23.04.18, 01:54 GMT ]