Pracuję dla platformy AVR i mam pytanie. Nie chcę, aby biblioteka zmiennoprzecinkowa była połączona z moim kodem, ale podoba mi się koncepcja posiadania wartości analogowych z zakresu 0.0 ... 1.0 zamiast 0 ... 255 i 0 ... 1023, w zależności od czy używam portu jako wejścia lub wyjścia.Optymalizacja zmiennoprzecinkowej kompilacji GCC
Postanowiłem więc pomnożyć argumenty funkcji wejściowych/wyjściowych przez odpowiednio 1023.0 i 255.0. Teraz moje pytanie brzmi: czy mogę wdrożyć podział takiego:
#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))
będzie GCC (z flagą -O3 włączony) optymalizacji czasu kompilacji pływających mnożenia punktów, znane w czasie kompilacji i oddanych do integralną typ, na operacje całkowite? (Wiem, że podczas używania tych makr z niestałymi argumentami, optymalizacja nie jest możliwa, chcę tylko wiedzieć, czy zostanie to zrobione w drugim przypadku).
nie powinien to być mnożenie, a nie podział? ('analog_out (7, 0.5)' staje się zapisem '0.5 * 255' do portu 7, zamiast zapisu 0 pocięte z 1/510) ... – Borealid
tak, oczywiście :) Naprawiono. –
Wypróbuj i przekonaj się! 'gcc -S' spowoduje utworzenie zrzutu zespołu. Prawdopodobnie potrzebujesz '-O2 -ffast-math', a nie' -O3' ('-O3' włącza optymalizacje, które prawie zawsze są net * lose *, jak over-aggressive inline, to ma być używane na jeden plik, w którym twój program spędza 90% czasu). – zwol