Miałem ostrzeżenie
warning: comparison of integers of different signs: 'int' and 'uint32_t' (aka 'unsigned int') [-Wsign-compare]
27 | if (diff < diff_min) {
Stwierdziłem że zmienię w kodzie kolegi typ zmiennej diff
na uint , ostrzeżenie usunąłem ale się okazało że wynik jest inny
int diff
poprawna wartość WYNIK 7500000.000000
uint diff
bledna wartość WYNIK -nan
Z tego co widzę po drodze jest dzielenie przez zero , ale dlaczego wyniki są inne ? UB ?
https://godbolt.org/z/Gf74E4hc6
#include <cstdint>
#include <cmath>
#include <cstdio>
auto Set_D = [](double newM, int Rmin, double &RefS)
{
double RefSi;
double roundFact;
uint32_t diff_min{2147483647};
int diff; // <<<<<<<<<<<<<< TUTAJ <<<<<<<<<
int nr;
int dn;
double rsf = newM * 1000000 ;
double sr = 60000000;
RefSi = rsf / sr;
for (int i = 0; i < Rmin; ++i){
roundFact = round(i * RefSi);
printf("roundFact = %f\n", roundFact);
auto tmp = rsf - roundFact * sr / (double)i;
diff = fabs(tmp);
printf("tmp:%f diff:%d diff_min:%d\n", tmp, diff, diff_min);
if (diff < diff_min) {
printf(".\n");
diff_min = diff;
nr = (int)roundFact;
dn = i;
}
}
printf("dn = %d\n", dn);
RefS = sr * nr / (double)dn;
};
int main()
{
double newM=7.5;
int Rmin=16;
double RefS=0;
Set_D(newM, Rmin, RefS);
printf("WYNIK %f", RefS);
}
Zdecydowanie podoba mi sie bardziej domyślny sposób obsługi dzielenia przez zero w Delphi
Domyślnie wygląda tak: