Периоды в Delphi
-=[ 13 октября 2004 г. # среда # 12:16:12 # GMT+0200 ]=-
Привета!
Такая во проблемма:
a:extended;
a:=1/3;
Invalid Floating Point Operation :(
Как обрезать extended на определенном знаке после запятой?
← Октябрь 2004 → | ||||||
7
|
||||||
17
|
||||||
18
|
||||||
30
|
За последние 60 дней ни разу не выходила
Сайт листа:
http://codeguru.ru
Открыт:
21-09-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.prog.prog-list@subscribe.ru
Адрес
модератора: comp.soft.prog.prog-owner@subscribe.ru
-=[ 13 октября 2004 г. # среда # 12:16:12 # GMT+0200 ]=-
Привета!
Такая во проблемма:
a:extended;
a:=1/3;
Invalid Floating Point Operation :(
Как обрезать extended на определенном знаке после запятой?
-=[Здрасте!]=-
13 октября 2004 г. /среда 13:45:27/ Surin_bp |E-Mail: <mailto:surin_***@m*****.ru>|
в мессаге <<Периоды в Delphi>> накрапал:
[B~E~G~I~N~>
Surin_bp> 1) Никакого Инвалида не наблюдается :)) - чей-то у Вас не так, как
написали
Surin_bp> 2) a:=round(a*1000)/1000;
[E|.|N|.|D|.>
Да писал я так :( Это стандартная фишка.
Суть в том, что там не конкретно 1/3, а просто пары чисел, которые при делении
дают числа с периодами. Комп побует все их вместить (периоды эти) и пишет ошибочку.
Hello -=[-B0yMaN-]=-,
Wednesday, October 13, 2004, 10:21:42 PM, you wrote:
ошибочку.
Не вижу смайлика 8(
FPU процессора ничего не знает о понятии "периодическая дробь"!
Вычисляется столько значащих цифр, сколько позволяет точность формата.
Похоже, никому до сих пор не удалось повторить эту ошибку :)
Привет Rooslan,
Thursday, October 14, 2004, 5:06:59 PM, вы писали:
Может у тебя каким-то макаром FPU вылетело :-))
А ошибки a:=1/3; никогда не было и не будет при любом "дробном" типе a
Ошибка скорее всего Run time error, так что ищи ошибку в логике
программы!!!
Афоризм напоследок: Ничто так не ограничивает мировоззрение как размеры зарплаты.
15 октября 2004 г. 22:24:49
Просто студент
Eugene mailto:rav***@o*****.ru
Номер выпуска : 3699
Возраст листа : 390 (дней)
Количество подписчиков : 487
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/245843
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
-*Информационный канал Subscribe.Ru
Подписан адрес:
Код этой рассылки: comp.soft.prog.prog
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru?subject=comp.soft.prog.prog
http://subscribe.ru/ http://subscribe.ru/feedback
-=[Хайушки!]=-
15 октября 2004 г. /пятница 21:28:38/ Eugene |E-Mail: <mailto:rav***@o*****.ru>|
в мессаге <<Периоды в Delphi>> накрапал:
[B~E~G~I~N~>
Eugene> Привет Rooslan,
Eugene> Thursday, October 14, 2004, 5:06:59 PM, вы писали:
~~~< Message on address 0x00000000 cannot be read (written) >[E|.|N|.|D|.>
Да с ФПУ все ок! Спасибо Алексу Томилову! Натолкнул на мысль... :beer: хотя сам
был немног не прав ;)
Hello Surin_bp,
Wednesday, October 13, 2004, 3:45:27 PM, you wrote:
Ошибки действительно никакой нет (и быть не может).
Есть еще функция RoundTo, но она принимает и возвращает Double. Вам
действительно нужна вся точность Extended?
-=[Привет!]=-
13 октября 2004 г. /среда 13:45:27/ Surin_bp |E-Mail: <mailto:surin_***@m*****.ru>|
в мессаге <<Периоды в Delphi>> накрапал:
[B~E~G~I~N~>
Surin_bp> 1) Никакого Инвалида не наблюдается :)) - чей-то у Вас не так, как
написали
Surin_bp> 2) a:=round(a*1000)/1000;
[E|.|N|.|D|.>
Видать вся фигня не в этом :( Уже дошло до того, что
A=63
B=0.11
delX:=B/A; Error!!!Invalid Floating Point Operation
NOP:=A; Error!!!Invalid Floating Point Operation
Что это за лажа?????????
Здравствуйте, -=.
Вы писали 13 октября 2004 г. в 12:17:44 [GMT +2:00]:
Я использую вот такую функцию. Очень хорошо это делает.
Delphi:
function MyRoundEx(const X, N : Extended): Extended;
{N : 1 - до целых, 10 - до десятых, 100 - до сотых...}
var
ScaledFractPart, Temp : Extended;
begin
ScaledFractPart := Frac(X) * N;
Temp := Frac(ScaledFractPart);
ScaledFractPart := Int(ScaledFractPart);
if Temp >= 0.5 then ScaledFractPart := ScaledFractPart + 1;
if Temp <= -0.5 then ScaledFractPart := ScaledFractPart - 1;
Result := Int(X) + ScaledFractPart / N;
end;
C++Builder:
double MyRoundEx(double X, double N)
{
double ScaledFractPart, Temp;
ScaledFractPart = X * N;
Temp = modf(ScaledFractPart, &ScaledFractPart);
if (Temp >= 0.5)
ScaledFractPart += 1;
if (Temp <= -0.5)
ScaledFractPart -= 1;
return ScaledFractPart;
}
1) Никакого Инвалида не наблюдается :)) - чей-то у Вас не так, как написали
2) a:=round(a*1000)/1000;