Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.231.245] |
|
Сообщ.
#1
,
|
|
|
Пусть есть функция преобразования lDOuble в AnsiString.
AnsiString asLongDouble_To_String(long double ldValue) { std::stringstream sStream; sStream << ldValue; //ЧТо-то там дальше. } На момент записи Long DOuble в поток происходит его запись в виде "4.29497e+09". То есть, происходит потеря информации от изначального числа 4294967295. Как заставить поток не преобразовывать значение в математический вид - а просто записать как есть? |
Сообщ.
#2
,
|
|
|
Форматировать вестимо.
|
Сообщ.
#3
,
|
|
|
Цитата Сергей85 @ sStream << ldValue; sStream << std::fixed << ldValue; |
Сообщ.
#4
,
|
|
|
Сообщ.
#5
,
|
|
|
Сообщ.
#6
,
|
|
|
Цитата Qraizer @ На скрине точно билдер 6 версии? |
Сообщ.
#7
,
|
|
|
Нет. Это МССтудия 2017-ой пробы. Можешь проверить МИНГВой, будет то же.
|
Сообщ.
#8
,
|
|
|
#include <vcl.h> #include "sstream.h" //Êîíâåðòàöèÿ String â Long Double. AnsiString asLongDouble_To_String(long double ldValue) //Êîíâåðòàöèÿ long double âîçìîæíà òîëüêî ÷åðåç ïîòîê. { stringstream sStream; sStream.precision(10000); sStream << ldValue; //sStream << std::fixed << ldValue; - íå ðàáîòàåò ñ áîëüøèìè ÷èñëàìè âèäà 10^38, à òàêæå äîïèñûâàåò 6 íóëåé ïîñëå çàïÿòîé. string sValue = sStream.str(); AnsiString asValue = ""; for (unsigned int i=0; i<sValue.length(); i++) asValue += sValue[i]; return asValue; } long double ldString_To_LongDouble(AnsiString asValue) //Êîíâåðòàöèÿ long double âîçìîæíà òîëüêî ÷åðåç ïîòîê. { long double ldResult = 0; string sValue = ""; for (int i=0; i<asValue.Length(); i++) sValue.append(asValue.SubString(i+1,1).c_str()); if (asValue.Pos(DecimalSeparator)==0) sValue.append(DecimalSeparator + "0"); stringstream strStream(sValue); strStream >> ldResult; return ldResult; } Среда разработки не содержит функций, позволяющих перетипировать Long Double в AnsiString и обратно. Самописные функции же сталкиваются с неправильным преобразованием больших чисел (в т.ч. из-за научного их представления). Например, предел Unsigned Long Long (18446744073709551615) преобразуется как 18446744073709551620 - то есть, происходит переполнение переменной на 5. В связи с этим, максимум для дробных переменных и части больших целочисленных переменных ограничен вручную до +-9223372036854775808. |
Сообщ.
#9
,
|
|
|
64 * lg(2) ≈ 19,25, что означает, что 64 бит мантиссы недостаточно для точного представления 20 десятичных знаков.
|