Автор Тема: проблема с типом float.  (Прочитано 15469 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
проблема с типом float.
« : 15/10/2012 14:35:33 »
есть кусок кода ниже. вот: если переменную "a" объявить unsigned int, то в окне получим округлённое значение типа float, а если её объявить float - ом то всё идёт отлично. чо за беда ?
//---------------------------------------------------------------------------

void __fastcall TForm1::frequencyChange(TObject *Sender)
{float f,f1,freq;

unsigned int a;
AnsiString s;
for(a=1;a<11;a++)if ((frequency->Text[a])!='.') s+=frequency->Text[a];
freq=StrToFloat(s);if (freq==0) goto end;
a=60000000/freq;
f=60000000/a;f1=60000000/(a+1);
  if ( (freq-f)>(freq-f1) ) f=f1;
actual_freq->Caption="Actual frequency : "+ FloatToStr(f); //
end:
}
//---------------------------------------------------------------------------
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн SkaT

  • Наш человек
  • Эксперт
  • ***
  • Сообщений: 4943
  • Похвалили: 839 раз(а)
Re: проблема с типом float.
« Ответ #1 : 15/10/2012 15:06:19 »
Наверное как обычно, в математической операции (любой) нужно применять переменные (константы) одного типа, иначе компилятор начнет преобразовывать тип по своему усмотрению. Соответственно результат будет отличаться от "ожидаемого".
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #2 : 15/10/2012 15:10:56 »
ну да, по ходу это и произошло, может просто есть какие типичные настройки, запрещающие преобразование типа?...
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн SkaT

  • Наш человек
  • Эксперт
  • ***
  • Сообщений: 4943
  • Похвалили: 839 раз(а)
Re: проблема с типом float.
« Ответ #3 : 15/10/2012 15:14:36 »
Не, это наврядли.
Попробуй указатели типа, может прокатит.
Не помню где используются, в голове каша.
ну типа: f=60000000.0/(float)a
Или что-то в этом духе.
 

Оффлайн Prz777

  • Резидент
  • Ветеран
  • ****
  • Сообщений: 836
  • Похвалили: 697 раз(а)
Re: проблема с типом float.
« Ответ #4 : 15/10/2012 15:28:12 »
Переменную а необходимо объявить float, т.к. она получается результатом деления a=60000000/freq; А потом если нужно получить целое применить округление.
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #5 : 15/10/2012 16:12:16 »
прикооллл. а как такое понимать ??? ?
void __fastcall TForm1::frequencyChange(TObject *Sender)
{float f,f1,freq;//  ,a

unsigned int int_freq,a;
AnsiString s;
for(a=1;a<11;a++)if ((frequency->Text[a])!='.') s+=frequency->Text[a];
freq=StrToFloat(s);if (freq==0) goto end;
int_freq=StrToInt(s);

a=(60000000/int_freq);

f=60000000/(float)a;f1=60000000/ (float) (a+1);
actual_freq->Caption="Actual frequency : "+ FloatToStr(f)+"  a="+IntToStr(a)+" f1="+FloatToStr(f1);

  if ( (freq-f)>(freq-f1) ) f=f1;

end:
}
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн SkaT

  • Наш человек
  • Эксперт
  • ***
  • Сообщений: 4943
  • Похвалили: 839 раз(а)
Re: проблема с типом float.
« Ответ #6 : 15/10/2012 16:19:15 »
А что не ток-то, ты напиши.
Вроде всё верно. f1, отличается от калькулятора компа только в пятой цифре после запятой.
Что не нравится???
Если целое значение результата   f=60000000/(float)a
То думаю компилятору (float) не достаточно.
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #7 : 15/10/2012 16:23:05 »
60 000 000 / 53571 = 1120,0089600716805734445875567005 - дробное число, а выводится без дробной части.
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #8 : 15/10/2012 16:33:49 »
 :o   бред какой то - ща с дробной частью выдаёт - мистика...
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн SkaT

  • Наш человек
  • Эксперт
  • ***
  • Сообщений: 4943
  • Похвалили: 839 раз(а)
Re: проблема с типом float.
« Ответ #9 : 15/10/2012 16:42:57 »
Я ещё у тебя не вижу инициализации строковой переменной s.
Лучше самому следить за начальными значениями переменных а не доверять компилятору, и тем более компу.


Отклоняясь от темы.
Уже несколько раз показывали передачу по "кабельному".
Ученый, установил по всему миру кучу генераторов "RND".
Если в мире всё "в рамках", то "RND" даёт 50% нулей и 50% единиц.
Но не за долго до катастроф начинается отклонение от 50/50.


Так что "мыслеформы" влияют на работу процессора...
[size=78%]:)[/size]

Кстати, проверил на Делфи, такой проблемы нет (в данном контексте).
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #10 : 15/10/2012 16:53:27 »
Я ещё у тебя не вижу инициализации строковой переменной s.
5 ая строчка : AnsiString s;
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн Prz777

  • Резидент
  • Ветеран
  • ****
  • Сообщений: 836
  • Похвалили: 697 раз(а)
Re: проблема с типом float.
« Ответ #11 : 15/10/2012 17:15:59 »
Введи новую переменную float b; для вычисления b=(60000000/int_freq);. Переменная int a; для a=1;a<11;a++
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #12 : 15/10/2012 17:19:27 »
b=(60000000/int_freq);
тут прикол в том, что эта переменная и должна быть unsigned int - она будет перекидываца в 32-ух битный таймер внутри камня - задавая тем самым коэффициент деления. и вся эта котовасия с разными типами - стремление подобрать как можно ближе частоту желаемой.
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн Prz777

  • Резидент
  • Ветеран
  • ****
  • Сообщений: 836
  • Похвалили: 697 раз(а)
Re: проблема с типом float.
« Ответ #13 : 15/10/2012 17:44:12 »
После b=(60000000/int_freq); нужно применить округление до  меньшего. На Delphi это было-бы так a:=Round(b);. Далее использовать a.
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #14 : 15/10/2012 17:48:30 »
сейчас уже другой прикол - через раз выдаёт то с дробной частью, то без неё.
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн Prz777

  • Резидент
  • Ветеран
  • ****
  • Сообщений: 836
  • Похвалили: 697 раз(а)
Re: проблема с типом float.
« Ответ #15 : 15/10/2012 19:07:54 »
Долго долбил. Без дробной части получалось если вводить 1,10,100,1000 и т.д. Остальные все с дробной частью.
 

Оффлайн SkaT

  • Наш человек
  • Эксперт
  • ***
  • Сообщений: 4943
  • Похвалили: 839 раз(а)
Re: проблема с типом float.
« Ответ #16 : 15/10/2012 19:32:22 »
Даже при небольших значениях частоты дробная часть отваливается?
Или только при значениях выше 6.7MГц ???
« Последнее редактирование: 15/10/2012 20:47:57 от SkaT »
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #17 : 15/10/2012 19:37:39 »
чот я под вечер тупить начал - вроде на месте дробная часть.... надо срочно горлышко смочить...
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн drfaust

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 5277
  • Похвалили: 575 раз(а)
  • Я не Шариков, просто судьба располосовала мой лоб.
  • Откуда: РФ, Лангепас, MSK+2 (UTC+5)
    • faust.dlinkddns.com
Re: проблема с типом float.
« Ответ #18 : 16/10/2012 00:58:19 »
60000000
преепиши в 60000000.0 - не знаю как в паскале (дельфи), а вот в С/С++ желательно явно указать тип константы, разные компилеры могут по разному преобразовывать типы (один 60 лямов преобразует в float/double, другой наоборот а преобразует в инт.)

И да тут f=60000000/a;f1=60000000/(a+1); у тебя а - целое, т.е. 60000000 - тоже целое, таким образом делим целое на целое получаем целое (без всяких дробей), а уже потом преобразовываем оператором присваивания во float. Если с этим floaf f что-то ещё делаешь, то могут появится погрешности в виде к-то десятых/тысячных.
Не кассами одними жив ЦТО ;-)
 

Оффлайн Prz777

  • Резидент
  • Ветеран
  • ****
  • Сообщений: 836
  • Похвалили: 697 раз(а)
Re: проблема с типом float.
« Ответ #19 : 16/10/2012 02:32:21 »
делим целое на целое получаем целое (без всяких дробей)
К примеру 3:2=1,5. Тип переменной результата должен быть float или double.
 

Оффлайн tridentxp

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 7516
  • Похвалили: 1107 раз(а)
  • Откуда: ARMвиль
Re: проблема с типом float.
« Ответ #20 : 16/10/2012 08:06:03 »
drfaust, сенькью, на всякий пожарный прописал константу дробной. вощем забадать удалось через известную на руси точку - пятую:
Caption="Actual frequency :"+ FloatToStr(60000000.0/a), а не FloatToStr(f).
теперь дробная часть отображается.
« Последнее редактирование: 16/10/2012 08:35:30 от tridentxp »
то, что дарвин и вы называете эволюцией, является лишь умыслом Отца.
 

Оффлайн drfaust

  • Резидент
  • Эксперт
  • ****
  • Сообщений: 5277
  • Похвалили: 575 раз(а)
  • Я не Шариков, просто судьба располосовала мой лоб.
  • Откуда: РФ, Лангепас, MSK+2 (UTC+5)
    • faust.dlinkddns.com
Re: проблема с типом float.
« Ответ #21 : 16/10/2012 10:17:13 »
Caption="Actual frequency :"+ FloatToStr(60000000.0/a), а не FloatToStr(f).
f=60000000.0/float(a);будет правильнее, я говорил, что паскаль я намертво забыл, а поведение С/С++ в этом случае будет зависеть от компилера(порядок преобразования типом в стандарте не описан).
Не кассами одними жив ЦТО ;-)
 

Оффлайн SkaT

  • Наш человек
  • Эксперт
  • ***
  • Сообщений: 4943
  • Похвалили: 839 раз(а)
Re: проблема с типом float.
« Ответ #22 : 16/10/2012 10:39:34 »
Кстати у функции FloatToStr() возможно есть параметр "формат строки". В паскале вроде есть. Должна быть возможность указать количество знаков после запятой, в строке. Тогда, даже в случае "целого" числа, будет показывать с нулями, это выглядит более корректно.
 

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24