Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
ВнизПролема с преобразованием типов... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c