ZASADA 0 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба дсп еще не щупали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба В железе: ATMega128 16MHz, замеры времени по TIMER1 плюс прерывание по его переполнению для увеличения разрядности. float Time (1000000) = 0x0000230D 2135 36,7539393125 сек double Time (1000000) = 0x0003887D 262C 948,42531475 сек чойта странно, при double получилось 15 174 805 036 тактов, при float - 588 063 029 тактов. Смущает кратность в 26 раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба чойта странно, при double получилось 15 174 805 036 тактов, при float - 588 063 029 тактов. Смущает кратность в 26 раз. Все вопросы к компилятору: asm_float.txt asm_double.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба Все вопросы к компилятору: ну а где D_ADD_L11, D_DIV_L11, SL2D_L11 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба Ужесточил типы, теперь между double и float разница 8-9-и кратная! float Time (10000) = 00000107 BA45 1,0802283125 сек Time (100000) = 00000A49 CDB9 10,7880595625 сек Time (1000000) = 0000661C 332D 107,0702588125 сек double Time (10000) = 000007AD AF87 8,0514484375 сек Time (100000) = 00005F37 60E0 99,84155 сек Time (1000000) = 0003B3B0 8E95 993,7246493125 сек Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба Ужесточил типы, теперь между double и float разница 8-9-и кратная! float Time (1000000) = 0000661C 332D 107,0702588125 сек double Time (1000000) = 0003B3B0 8E95 993,7246493125 сек Чой та я в шоке. Что вообще за компилятор ? теперь у вас увеличилось время для float почти в три раза, но стало близко к моему с 1% ошибкой ( 1 713 124 141 vs 1 725 881 000 ) но double долго считается по отношению к коду сгенеренному в IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 12 января, 2014 Опубликовано 12 января, 2014 · Жалоба PIC32, 80 MHz (оптимизация средненькая, такую дает бесплатный вариант лицензии MPLAB-C32 компилятора ) typedef long double f64; typedef unsigned int u32; volatile f64 a = 1; volatile f64 b = 1234.567; int main(void) { u32 i; //рабочий цикл for (i=0; i<1e6; i++) { a = a + ((f64)i / b ); b = b + 0.000001; //на всякий пожарный if (a>100000000) a = 1; } return 0; } 510024595 машинных циклов 6.375307 секунд Если 32-битные вычисления typedef float f64; 415782614 мц 5.197283 секунд Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба Чой та я в шоке. Что вообще за компилятор ? IAR C/C++ Compiler for AVR 5.50.0 (5.50.0.50277)C:\Program Files\IAR EW 5.5\avr\bin\iccavr.exe 14.04.2010 16:14:06, 11579392 bytes Full DLIB - \avr\LIB\DLIB\dlAVR-3s-ec_mul-64-f.r90 #define cycle 1000000L #define TT double //#define TT float TT test(void) { TT a = (TT)1.0; TT b = (TT)1234.567; for (long i = 0; i < cycle; i++) { a = a + ( (TT)i / b ); b = b + (TT)0.000001; if (a > (TT)100000000.0) a = (TT)1.0; } return(a); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба avr32 60MHz i = 1 000 000 без оптимизации double 7,544 сек float 3,177 сек на макс оптимизации double 6,904 сек float 208 мсек Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба avr32 60MHz i = 1 000 000 без оптимизации double 7,544 сек float 3,177 сек на макс оптимизации double 6,904 сек float 208 мсек 208 миллисекунд? Примерно 12 циклов на операцию? Чегото слишком оптимистично.. 12 миллионов циклов супротив майкрочиповских 500 миллионов? Не верится.. Это в симуляторе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба на реальной плате причем double не особо круто соптимизировало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба на реальной плате причем double не особо круто соптимизировало. a ассемблерный код есть посмотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба 800036E0 mov R8, 0 800036E2 movhi R7, 0x3f80 800036E6 sub R8, -1 800036E8 cp.w R8, 1000000 800036EC breq 0x8000370e 800036EE cop CP0, CR9, CR0, CR8, 12 800036F2 cop CP0, CR7, CR9, CR5, 14 800036F6 cop CP0, CR0, CR7, CR6, 24 800036FA brvs 0x80003702 800036FE brle 0x800036e6 80003702 movhi R7, 0x3f80 80003706 sub R8, -1 думаю гдето дурит, слишком сильно ускоряет вычисление даже при включение минимальной оптимизации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба Кстати, если посмотреть в float числа: 1234.567 = 0x449A 5225 1234.567001 = 0x449A 5225 и только 1234.5671 = 0x449A 5226 и компилятор наверное об этом знает :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба на реальной плате причем double не особо круто соптимизировало. Такое ощущение, что там Ваш никнейм приключился :) И оно "соптимизировало" переменные, так как они больше нигде не используются. или цикл "соптимизировало". Попробуйте их объявить как volatile, ну или посмотрите что там в a и в b после выполнения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться