![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пролема с преобразованием типов... [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 бита.