На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Округление данных при помещении в поток. , Borland C++ Builder v.6.0.
    Пусть есть функция преобразования lDOuble в AnsiString.
    ExpandedWrap disabled
      AnsiString asLongDouble_To_String(long double ldValue)
      {
          std::stringstream sStream;
          sStream << ldValue;
          
          //ЧТо-то там дальше.
      }


    На момент записи Long DOuble в поток происходит его запись в виде "4.29497e+09". То есть, происходит потеря информации от изначального числа 4294967295.

    Как заставить поток не преобразовывать значение в математический вид - а просто записать как есть?
      Форматировать вестимо.
        Цитата Сергей85 @
        ExpandedWrap disabled
              sStream << ldValue;
        ExpandedWrap disabled
              sStream << std::fixed << ldValue;
          Цитата Qraizer @

          К сожалению, работает лишь условно. Например, 0 возвращается как 0.0000, а большие числа - вызывают падение программы.

          Прикреплённая картинка
          Прикреплённая картинка
            Сергей85, ты прикалываешься скриншотами? Ок, я тоже так умею.
            Прикреплённая картинка
            Прикреплённая картинка

            И вообще, бросал бы ты ...неработающие инструменты использовать.

            Добавлено
            И вообще:
            ExpandedWrap disabled
              std::string str = std::to_string(std::numeric_limits<long double>::max())
              Цитата Qraizer @

              На скрине точно билдер 6 версии?
                Нет. Это МССтудия 2017-ой пробы. Можешь проверить МИНГВой, будет то же.
                  ExpandedWrap disabled
                    #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.
                    64 * lg(2) ≈ 19,25, что означает, что 64 бит мантиссы недостаточно для точного представления 20 десятичных знаков.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0575 ]   [ 20 queries used ]   [ Generated: 18.04.24, 23:31 GMT ]