Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пролема с преобразованием типов... [D6, NT4]


Pavlik_Morozov ©   (2004-10-27 13:29:00) 

Уважаемые господа!
Проблема следующая:
при сложении чисел
  (-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;


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

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


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

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


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

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

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


Anatoly Podgoretsky   (2004-10-27 14:30:00) [4]

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


Johnmen   (2004-10-27 14:17:00) [5]

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

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


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

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

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

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


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

Johnmen

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


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


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

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


Digitman   (2004-10-27 14:01:00) [9]


> Pavlik_Morozov



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


дурь.

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


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

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


Johnmen   (2004-10-27 13:59:00) [11]

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

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


Amoeba   (2004-10-27 13:55:00) [12]

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


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

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


Johnmen   (2004-10-27 13:47:00) [14]

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


MBo   (2004-10-27 13:43:00) [15]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо