Ok,
Według życzenia poprawione BASCOM-y.
Wersja z float (single):
Kod:
$noinit
$noramclear
$regfile "m32def.dat"
$crystal = 16000000
Dim Fclk As Dword
Dim Fvfo As Dword
Dim Pom As Single
Dim Pom2 As Single
Dim Ftw As Dword
Fclk = 400000000
Fvfo = 20000000
Pom = &H100000000
Pom2 = Fvfo
Pom = Pom * Pom2
Pom2 = Fclk
Pom = Pom / Pom2
Ftw = Pom
End
test_1a_ba.zip (Rozmiar: 4.3 KB / Pobrań: 821)
Wynik:
Kod: 888 (40+848)
Cykle: 1 609 (20+1 589) - ~101ns
Wynik: 0x0CCCCCD0
Wersja z Double:
Kod:
$noinit
$noramclear
$regfile "m32def.dat"
$crystal = 16000000
Dim Fclk As Dword
Dim Fvfo As Dword
Dim Pom As Double
Dim Pom2 As Double
Dim Pom3 As Single
Dim Ftw As Dword
Fclk = 400000000
Fvfo = 20000000
Pom = &H100000000
Pom3 = Fvfo
Pom2 = Pom3
Pom = Pom * Pom2
Pom3 = Fclk
Pom2 = Pom3
Pom = Pom / Pom2
Ftw = Pom
End
test_1b_ba.zip (Rozmiar: 7.13 KB / Pobrań: 825)
Wynik:
Kod: 1 590 (40+1 550)
Cykle: 3 439 (20+3 419) - ~215ns
Wynik: 0x0CCCCCCD
Okazało się że w BASCOM-ie nie można bezpośrednio przypisać zmiennej DWORD do Double.
Najpierw wykonałem próby z mnożenie i dzielenie Double i Single (Float) okazało się jednak, że wyniki są nieprawidłowe.
Nie wiem czy to błąd symulatora czy samego kompilatora, trzeba będzie sprawdzić to na procesorze.
Stąd własnie najpierw konwersja danych z DWORD do Single, a następnie dopiero z Single do Double.
Wyniki oczywiście przez takie podwójne konwersję, są znacznie słabsze.