Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
Заблокирован

Double / float в строку и обратно

13.10.2015, 20:48. Показов 5645. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
знаю есть готовые методы, мне просто интересен алгоритм, как это можно реализовать? почему то нигде не найти реализации... в конце концов раз есть библиотечные методы преобразования значит и алгоритм какой то существует...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.10.2015, 20:48
Ответы с готовыми решениями:

Перевести одну строку c float в double
Подскажите. Есть код. Все задано через float. Но 10 VS не вытаскивает одну из строк, и из-за этого необходимо задать все через double, но...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

Как обойтись без float, double, long double?
К примеру мне надо в программе использовать что-то вроде -0,00000000000003626686812 и 0,00000000000002072392464. Притом чтобы считалось...

54
Заблокирован
14.10.2015, 09:39  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
Ну так математику учи, разделы "экспоненциальная запись" и "логарифмы". Число хранится в форме мантисса*2^экспонента. Мантисса и экспонента - целые числа. Соответственно, число меняется с шагом 2^экспонента, отсюда и неизбежные ошибки округления. 36 пост же переводит число в более привычную форму мантисса*10^экспонента, утаскивая первые 16 знаков мантиссы в целое число. На остальные знаки пофиг - их съели ошибки округления.
я же говорю я хочу сделать это безо всяких других функций, чисто вытащить мат операциями знак, порядок и мантиссу, а потом сконвертировать... чтоб уж точно не было никаких ошибок округления, видишь вытащить я их уже вытащил, осталось сконвертировать, но я не очень понимаю как мне ставить дробную точку с таким порядком...

Добавлено через 3 минуты
и вот это еще, сразу не заметил
Цитата Сообщение от Barrent Посмотреть сообщение
точно, перед переводом нужно будет сдвинуть вправо на необходимое число бит, определяемое порядком.
если у меня порядок 1029 я же не буду на 1029 бит сдвигать))) как это понимать опять таки?

Добавлено через 2 минуты
еще раз я че то запутался, порядок что определяет? место дробной точки или количество бит на которые надо сдвинуть мантиссу?
0
Заблокирован
14.10.2015, 10:04  [ТС]
вот смотрите какую интересную статейку я нарыл тута
ну вот как они например получили такую двоичную запись числа в первом пункте? у меня другое получается...
Миниатюры
Double / float в строку и обратно  
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.10.2015, 10:50
Цитата Сообщение от Volrajas Посмотреть сообщение
я же говорю я хочу сделать это безо всяких других функций, чисто вытащить мат операциями знак, порядок и мантиссу, а потом сконвертировать... чтоб уж точно не было никаких ошибок округления, видишь вытащить я их уже вытащил, осталось сконвертировать, но я не очень понимаю как мне ставить дробную точку с таким порядком...
Если совсем без ошибок, тогда нужны целочисленные вычисления. То есть, длинная арифметика. В остальном та же петрушка - X=M*2^E. Если X - целое число, задача его печати тривиальна. Если не целое число, то делаем целым, заменив на X1=10^N*M*2^E. Потом последние N знаков X1 отделяем точкой.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
14.10.2015, 11:25
Можно и с меньшими трудозатратами сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <sstream>
#include <iostream>
#include <string>
 
template<class T> T StringToNumber(const std::string& stringRepresentation)
{
  T result;
 
  std::stringstream ss(stringRepresentation);
 
  ss >> result;
  if (ss.fail())
  {
    throw std::runtime_error(stringRepresentation);
  }
 
  return result;
}
 
template<class T> std::string NumberToString(const T number)
{
  std::stringstream ss;
 
  ss << number;
 
  return ss.str();
}
 
int main()
{
  float temp1 = StringToNumber<float>("0.67");
  double temp2 = StringToNumber<double>("0.00001234");
 
  std::string temp3 = NumberToString<float>(0.44f);
  std::string temp4 = NumberToString<double>(0.00000000665);
 
  std::cout << temp1 << " " << temp2 << " " << temp3 << " " << temp4 << std::endl;
 
  return 0;
}
0
Заблокирован
14.10.2015, 11:54  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Если совсем без ошибок, тогда нужны целочисленные вычисления. То есть, длинная арифметика. В остальном та же петрушка - X=M*2^E. Если X - целое число, задача его печати тривиальна. Если не целое число, то делаем целым, заменив на X1=10^N*M*2^E. Потом последние N знаков X1 отделяем точкой.
а как же порядок? что с ним делать? или E это и есть порядок? и что за N?

HighPredator, я вроде сказал что меня не интересуют готовые методы, мне интересен сам алгоритм
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.10.2015, 12:08
Цитата Сообщение от Volrajas Посмотреть сообщение
а как же порядок? что с ним делать? или E это и есть порядок? и что за N?
Я еще раз повторяю, учите тему "экспоненциальная запись". Да, E - порядок, M - мантисса. N - целое число, такое что 10^N*X=10^N*M*2^E - тоже целое число. Подсказка - M - целое число (не нормализованная мантисса). M*2^E - обыкновенная дробь. Задача "на сколько надо умножить обыкновенную дробь, чтоб получить целое число" рассматривается в школе, на уроке арифметики.
0
Заблокирован
14.10.2015, 12:27  [ТС]
Renji, я в общем то не так давно заканчивал школу, и врятли мог настолько забыть математику будучи ВТшником, но вот например
Цитата Сообщение от Renji Посмотреть сообщение
10^N*X=10^N*M*2^E
предлагаете решить уравнение с 2-мя неизвестными?))
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.10.2015, 12:29
Цитата Сообщение от Volrajas Посмотреть сообщение
предлагаете решить уравнение с 2-мя неизвестными?))
Слушайте, хватит тупить. Разложение X на мантиссу M и экспоненту E решается просмотром двоичного представления X. И вы, вроде бы, с этим уже справились.
0
Заблокирован
14.10.2015, 12:30  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
M*2^E - обыкновенная дробь.
обыкновенная или десятичная? то бишь M*2^E будет число типа 123.456 и мне надо найти ту самую 3 в которую надо возвести 10? я правильно понял?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.10.2015, 12:34
Цитата Сообщение от Volrajas Посмотреть сообщение
обыкновенная или десятичная?
Действительно, какой же дробью будет M умножить на два в степени E? Извините, но если это вызывает у вас вопросы, вам не следует лезть в подобные алгоритмы.
0
Заблокирован
14.10.2015, 12:35  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Слушайте, хватит тупить. Разложение X на мантиссу M и экспоненту E решается просмотром двоичного представления X. И вы, вроде бы, с этим уже справились.
да с этим то да, я про эту вашу N, думаю как ее найти

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Действительно, какой же дробью будет M умножить на два в степени E? Извините, но если это вызывает у вас вопросы, вам не следует лезть в подобные алгоритмы.
мне вообще кажется что это не будет никакой дробью, т.к. M - число целое, E - число целое, 2 ^ E тоже число целое, с чего бы там быть дроби???
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.10.2015, 12:47
Цитата Сообщение от Volrajas Посмотреть сообщение
мне вообще кажется что это не будет никакой дробью, т.к. M - число целое, E - число целое, 2 ^ E тоже число целое, с чего бы там быть дроби???
С того что 2^-4 = 1/16. А теперь угадайте является 1/16 десятичной дробью или нет.
0
Заблокирован
14.10.2015, 12:55  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
С того что 2^-4 = 1/16. А теперь угадайте является 1/16 десятичной дробью или нет.
а с чего вы взяли что возводить надо в -4? пока что у меня порядок еще ни разу не был отрицательным числом, да и вообще сомневаюсь что может быть, если я конечно не знаю еще каких то тонкостей... ведь знак есть только у самого числа в старшем бите, но не у порядка разве нет?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.10.2015, 13:17
Цитата Сообщение от Volrajas Посмотреть сообщение
а с чего вы взяли что возводить надо в -4? пока что у меня порядок еще ни разу не был отрицательным числом, да и вообще сомневаюсь что может быть, если я конечно не знаю еще каких то тонкостей... ведь знак есть только у самого числа в старшем бите, но не у порядка разве нет?
Не знаете тонкостей. Если буквоедствовать, но число хранится в формате "знак, порядок увеличенный на константу, двоичная мантисса без начальной единицы". При чтении всего это безобразия к мантиссе слева подписывается единичка, итоговое число делится на "чтоб результат был меньше двух" (нормализация), а затем умножается на два в степени порядок минус константа. Вот в момент "минус константа" отрицательная степень и вылезает. Ноль и бесконечность при этом записываются посредством бубна.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
14.10.2015, 21:35
В glibc в функциях типа printf() при преобразовании double и long double в строку используется библиотека длинных чисел GMP. Так что простого решения в три строки не получится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.10.2015, 21:35

float в HEX и обратно
У меня возникли трудности с конвертацией числа типа float (например 2.534) в 4 байта HEX (например строка FFAAFFAA) и обратно. Тип числа...

Преобразование CString->float и обратно
Здравствуйте. Можно ли строку типа CString преобразовать в число типа float (или double) (я уверен, что в строка будет вида 123.123)и...

Double to hex и обратно
Какое бы ни было число в памяти компьютера всё равно оно представлено в виде 0 и 1, как всем известно. Мне нужно преобразовать double в...

Преобразование в float и double
Начал читать книгу Шилдта. В одном из его примеров было показано преобразование типов int в float. Но при компилировании выражения я...

Задание с float и double
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Russian&quot;); float fA, fB, fC, fD,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru