C++ Builder — это StrToFloat(), то же самое, что и .ToDouble().

Я работаю над проектом XE6, но это может относиться и к другой версии компоновщика.

Я смотрю на имя функции, которое, я думаю, может вводить в заблуждение. Мне любопытно, возвращает ли StrToFloat() float или возвращает double. Я нашел альтернативу, .ToDouble(), но в нашем коде уже есть куча ссылок, которые используют StrToFloat(). Я хочу убедиться, что я получаю правильную точность, которую предлагают удвоения.

Я сделал пару тестов, таких как:

UnicodeString temp = "1234567890.12345678901234567890";
double a = StrToFloat(temp);
double b = temp.ToDouble();

Кажется, они дают те же значения, что и тесты, которые я провел, но я хочу убедиться, что StrToFloat() совпадает с .ToDouble().


person James Oravec    schedule 12.08.2014    source источник


Ответы (1)


Я нашел достаточно ссылок, чтобы ответить на свой вопрос...

StrToFloat() возвращает extended, а расширенный — long double.

.ToDouble() возвращает double.

Короткий ответ: они не одинаковы и различаются, как показано выше.

Использованная литература:

person James Oravec    schedule 12.08.2014
comment
.ToDouble() вызывает StrToFloat() внутри и возвращает Extended как double при выходе. Однако обратите внимание на документацию Extended. Extended — это long double на 32-битных платформах, но double на Win64. Разница в том, что double составляет 8 байтов (64 бита), а long double — 10 байтов (80 бит). Это 16-битная потеря точности на Win64. - person Remy Lebeau; 12.08.2014
comment
@RemyLebeau: это очень странно - person Mooing Duck; 12.08.2014
comment
@MooingDuck: это связано с аппаратным ограничением 64-битных процессоров. x86 изначально поддерживает 10-байтовые операции с плавающей запятой (вот почему Extended существовал в первую очередь), а x64 - нет. Embarcadero предоставляет тип TExtended80Rec для обработки 10-байтовых операций с плавающей запятой в x64, но, конечно, производительность не будет такой же, как у процессора, выполняющего их изначально. - person Remy Lebeau; 12.08.2014