16-11-2019, 12:40
Używanie typów zmiennopozycyjnych raz na sekundę to nic złego - ale w tym konkretnym programie faktycznie nie jest konieczne. Popatrz na kod:
diskslots to stała ma wartość 6.0, czyli Twój kod to w rzeczywistości:
Gdybyśmy po prostu zastąpili używanie float przez int, to kolejność operacji mnożenia i dzielenia ma znaczenie. Zobaczmy dla przykładu dwie wartości counter: 250 i 251.
Dla 250 mamy:
Speed = (250 / 6) * 60 = 41 * 60 = 2460
A dla 251:
Speed = (251 / 6) * 60 = 41 * 60 = 2460
Problem wynika z dzielenia counter przez 6, które powoduje błąd zaokrąglenia.
Używanie float w tym miejscu pomaga, ale nie jest konieczne - można po prostu zamienić kolejność operacji, najpierw mnożyć, a później dzielić.
Zobaczmy dla 250:
Speed = (250 * 60) / 6 = 2500
Dla 251:
Speed = (251 * 60) / 6 = 2510
Czyli zmieniając kod na:
możesz mięć poprawne wyniki bez używania float.
W rzeczywistości możesz nawet zauważyć, że (60 / diskslots) to po prostu 6.
Czyli można napisać:
Co będzie odpowiadało po prostu:
Dzięki temu nie tylko rezygnujesz z czasochłonnych operacji na typie float, ale pozbywasz się jeszcze dzielenia.
Nie wydaje mi się żeby to była przyczyna problemów, ale skoro pojawił się wątek float-ach to chciałem krótko podpowiedzieć, jak można się ich pozbyć
Kod:
Speed = (counter / diskslots) * 60.00;
diskslots to stała ma wartość 6.0, czyli Twój kod to w rzeczywistości:
Kod:
Speed = (counter / 6.0) * 60.00;
Gdybyśmy po prostu zastąpili używanie float przez int, to kolejność operacji mnożenia i dzielenia ma znaczenie. Zobaczmy dla przykładu dwie wartości counter: 250 i 251.
Dla 250 mamy:
Speed = (250 / 6) * 60 = 41 * 60 = 2460
A dla 251:
Speed = (251 / 6) * 60 = 41 * 60 = 2460
Problem wynika z dzielenia counter przez 6, które powoduje błąd zaokrąglenia.
Używanie float w tym miejscu pomaga, ale nie jest konieczne - można po prostu zamienić kolejność operacji, najpierw mnożyć, a później dzielić.
Zobaczmy dla 250:
Speed = (250 * 60) / 6 = 2500
Dla 251:
Speed = (251 * 60) / 6 = 2510
Czyli zmieniając kod na:
Kod:
Speed = counter * 60 / diskslots
W rzeczywistości możesz nawet zauważyć, że (60 / diskslots) to po prostu 6.
Czyli można napisać:
Kod:
Speed = counter * (60 / diskslots);
Co będzie odpowiadało po prostu:
Kod:
Speed = counter * 6
Nie wydaje mi się żeby to była przyczyna problemów, ale skoro pojawił się wątek float-ach to chciałem krótko podpowiedzieć, jak można się ich pozbyć