Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Пролема с преобразованием типов...   Найти похожие ветки 

 
Pavlik_Morozov   (2004-10-27 13:29) [0]

Уважаемые господа!
Проблема следующая:
при сложении чисел
 (-3822137.5) + (-0.10067)
типа Single в MyFunc(...) у меня остаётся число
 (-3822137.5)
то есть результат не меняется, хотя внутренняя функция DoOperation(...) возвращает нужное (-3822137.60067)!

Я достаточно давно пишу на Дельфи, но подобной проблемы раньше не встречал, ниже я сгенерил код, имитирующий проблему в моей программе.
ЗАМЕЧАНИЕ: на входе и выходе функции MyFunc(...) обязательно должны быть переменные типа Single.
Помогите пожалуйста!!!
Заранее благодарен...


function TForm1.MyFunc(const ASingleValue1, ASingleValue2:
 Single): Single;
type
 TMyOperation = (opAddition, opMultiplication);

 function DoOperation(AMyOp: TMyOperation): Extended;
 begin
   case AMyOp of
     opAddition:
       Result := ASingleValue1 + ASingleValue2;
     opMultiplication:
       Result := ASingleValue1 * ASingleValue2;
   end;    
 end;
begin
 Result := DoOperation(opAddition);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(FloatToStr(MyFunc(-3822137.5, -0.10067)));
end;


 
MBo ©   (2004-10-27 13:43) [1]

Такой уж это ограниченный тип Single - ты складываешь значения, различающиеся примерно на 8 десятичных порядков, или на 24 двоичных, а мантисса Single содержит только 23 бита.


 
Johnmen ©   (2004-10-27 13:47) [2]

-3822137.60067 в single ну  никак не ложится :)))


 
Pavlik_Morozov   (2004-10-27 13:51) [3]

Не совсем понял... у меня же здесь в принципе есть "готовый" Extended результат:
 (-3822137.60067)
тот, что возвращает DoOperation. Почему у меня в Single не записывается, хотя-бы (-3822137.6)?
И, вообще, может есть способ каким-то образом "записать" этот полученный Extended в возвращаемый Single?


 
Amoeba ©   (2004-10-27 13:55) [4]

Тебе уже 2 человека ответили, что НЕТ.


 
Johnmen ©   (2004-10-27 13:59) [5]

>Почему у меня ....

Да ты просто F1 притопи на Extended и/или Single
и здесь почитай
http://www.delphikingdom.com/asp/viewitem.asp?UrlItem=/helloworld/reals.htm


 
Pavlik_Morozov   (2004-10-27 14:00) [6]

ok, спасибо...


 
Digitman ©   (2004-10-27 14:01) [7]


> Pavlik_Morozov



> на входе и выходе функции MyFunc(...) обязательно должны
> быть переменные типа Single


дурь.

число 0.10067 не представимо в формате Single, разрядности мантиссы не достаточно


 
Pavlik_Morozov   (2004-10-27 14:08) [8]


> Digitman
> дурь.
> число 0.10067 не представимо в формате Single, разрядности
> мантиссы не достаточно

читай справку Delphi:
точность типа Single – 7-8 десятичных разрядов, так что уж 0.10067 точно "влезет"


 
Pavlik_Morozov   (2004-10-27 14:11) [9]

Johnmen

спасибо за ссылку - интересная инфа!


 
Defunct ©   (2004-10-27 14:16) [10]

> Digitman ©   (27.10.04 14:01) [7]

2^24 покроет (dec 10067) запросто.

или я не понял о чем речь.


 
Johnmen ©   (2004-10-27 14:17) [11]

>Digitman ©   (27.10.04 14:01) [7]

Серега, ты погорячился...:)


 
Anatoly Podgoretsky ©   (2004-10-27 14:30) [12]

3822137 это как раз разрядность Single, на дробное просто не остается места


 
Pavlik_Morozov   (2004-10-27 14:37) [13]

...это да, но, блин, до сих пор не въеду (даже прочитав статью, указанную по ссылке) почему у меня всё же на выходе
 (-3822137.5),
а не
 (-3822137.6)?
:)))

0.5 - это что, типа "мусор" что-ли?


 
Anatoly Podgoretsky ©   (2004-10-27 14:44) [14]

Число -3822137.6 не возможно представить, масимально близкое число это -3822137.5


 
Pavlik_Morozov   (2004-10-27 14:49) [15]

ok, понятно...



Страницы: 1 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.04 c
14-1098600944
Stef
2004-10-24 10:55
2004.11.14
Какое то маленькое окошко со списком имен


1-1098972789
Sp0k3r
2004-10-28 18:13
2004.11.14
Строки...


14-1098794537
Delphin
2004-10-26 16:42
2004.11.14
При переносе текста получаю "?? ???"


1-1098871899
Pashkerton
2004-10-27 14:11
2004.11.14
Обработка события


4-1097040756
П7
2004-10-06 09:32
2004.11.14
Консольное приложение