Перевод char в double

Как конвертировать char * в double?

Я попробовал два метода, чтобы преобразовать мой char* тип ss
на двойной тип.
Вот мой код (скомпилирован в VC ++ 6.0 windows64-bit)

Мне не понятно что не так и как конвертировать char* удвоить.

Решение

Ты можешь использовать strtod как это: double smth=strtod(ss,NULL,10);

Можно использовать немного другой синтаксис. Увидеть этот для примера.

Другие решения

Ваша проблема здесь в том, что АКТЕРЫ — НЕ КОНВЕРСИЯ:

в том, что вы конвертируете строку символов в число. Это означает, что ваша память содержит числа, являющиеся значениями ascii:

хранится в памяти как:

который в двоичном виде становится:

в памяти. При преобразовании в double вы заставляете компилятор учитывать, что эти числа читаются по-разному, что соответствует IEEE754 способ для парных . А потом 45,49,57,52 означает нечто совершенно иное, используя эту кодировку чисел.

Затем, учитывая, что символы равны 8 битам и двойным 32 битам, после приведения ваша память отображается следующим образом:

Затем, выполнив «ручную» интерпретацию IEEE754, вы получите три числа:

Что странно не соответствует ни одному из ваших значений, так что ваши объемы памяти могут отличаться, или какое-то волшебство происходит во время приведений.

Хороший способ — не переосмыслить память, а преобразовать значение, а хорошее решение — использовать strtod() от С или stod из стандартной библиотеки C ++. Вы найдете много способов справиться с конверсией в других ответах или в постах, дублирующих этот.

Если вы хотите повеселиться с этим просто попробуйте плавает на этой веб-странице .

Вы должны использовать std::stod функция (C ++ 11) с более современным компилятором

или, альтернативно, используйте std::stringstream от

Если вы используете приведение, то вы обрабатываете данные указателя как двойное значение, и это неправильно, так как указатель представляет собой целое число, представляющее адрес в памяти. Вам нужно интерпретировать данные, на которые указывает char* чтобы получить правильный результат, используйте sscanf , atof или другие функции, которые принимают char* и дать double

использование atof(const char*)

Ваш reinterpret_cast подход вряд ли будет работать, если только переменная с плавающей запятой со значением -1964734.544 был буквально представлен в памяти с помощью набора символов <'-', '1', '9', '6', '4', '7', '3', '4', '.', '5', '4', '4'>,

Таким образом, никакое значение с плавающей точкой не представляется в памяти. Период.

Если вы хотите решения C, используйте такие функции, как sscanf() , strtod() , и другие. Это возможно в C ++ из-за обратной совместимости, но большинство из них формально не рекомендуется.

Решение C ++ предполагает использование istringstream , например;

Источник

C Урок 14. Преобразование типов

На данном уроке мы поговорим о преобразовании типов данных в процессе работы программы из одного типа в другой.

Конечно, в идеальном случае, желательно, чтобы программа была построена таким образом чтобы лишний раз избегать всякого рода преобразований и использовать везде данные нужного типа. Но не всегда так получается и преобразование типа в ряде случаев просто необходимо. Например, мы складываем значения двух переменных типа unsigned short и, по идее у нас результат тоже должен присваиваться переменной типа unsigned short. Но мы не уверены в том, что этот результат уместится в такой тип, например, мы захотим сложить числа 65535 и 65534. Поэтому здесь без преобразования не обойтись. И таких ситуаций огромное множество, поэтому мы должны знать как происходит преобразование типов автоматически, а также как мы можем этим процессом управлять. Думаю, данный урок даст хоть и не полную картину преобразований типов, но, тем не менее, внесёт некоторую ясность в данную тему.

Для начала давайте начнём с автоматического преобразования типов, или, если это правильно назвать, с неявного приведения типов. В данном случае преобразованием типов будет управлять компилятор и мы никаких специальных операций для данного преобразования не применяем.

Если операнды некоторой операции принадлежат различным типам, то они автоматически приводятся к определённому общему типу. А к какому именно, существует ряд правил.

Также надо учесть, что автоматические преобразования типов имеют место лишь в тех случаях, когда они не влекут потери данных и при этом превращают операнды с меньшим диапазоном значений в операнды с большим диапазоном. Например, если мы складываем операнд целого типа с операндом с плавающей точкой, то первый автоматически приведётся к типу с плавающей точкой. Или, если мы складываем операнд типа int с оператором типа short, то второй автоматически превратится в число типа int, так как у него больший диапазон значений. Тем самым достигается принцип целостности информации. Если же результат наших операций мы попытаемся присвоить переменной такого типа, у которого меньший диапазон значений, то мы рискуем потерять часть информации, хотя при этом код все равно соберётся и мы получим лишь предупреждение.

Также неявное преобразование операндов какой-либо операции происходит в том случае, когда от этой операции есть смысл. А если мы, к примеру, захотим использовать тип с плавающей точкой в качестве номера элемента массива, то в таком случае мы уже получим ошибку.

Для того, чтобы заранее знать, какой общий тип мы получим при операции с разными типами данных, существует приоритет типов данных для операций преобразований типов. Вот перечень типов данных с убывающим приоритетом при операциях неявного приведения типов

  • long double
  • double;
  • float;
  • unsigned long long;
  • long long;
  • unsigned long;
  • long;
  • unsigned int;
  • int

Если в операции присутствуют операнды различных типов то компилятор вычисляет сначала операнд наивысшим приоритетом и неявно преобразовывает тип другого операнда, у которого приоритет ниже, к типу первого.

В операциях присваивания также может происходить неявное преобразование типов данных.

Например, если мы хотим значение 8-байтового типа присвоить переменной 4-байтового типа, неважно, целого типа эти данные или нет, то при этом произойдёт неявное преобразование к 4-байтовому типу, при этом старшие 4 байта отбрасываются. Это считается небезопасным приведением типов, когда возможна потеря информации.

Может быть и наоборот, если мы хотим значение 4-байтового типа присвоить переменной 8-байтового типа. Также произойдёт неявное преобразование и, наоборот, 4 старших байта добавятся и заполнятся нулями. Это будет уже безопасное приведение типа и при этом целостность информации не страдает.

Так как мы с указателями ещё не работали, то в данном уроке мы их преобразование рассматривать не будем, скажу лишь, что там всё происходит аналогично, разница в поведении указателей типа void.

Думаю, что теперь ситуация с неявным преобразованием типов теперь немного стала понятна, конечно же, полное понимание придёт лишь с практикой.

Явное преобразование типов происходит тогда, когда мы применяем специальные механизмы для приведения одного типа к строго определённому другому типу. В языке C в для явного приведения типа перед переменной или выражением, значения которых мы преобразуем к другому типу, ставится в круглых скобках тип, к которому мы данное значение преобразуем, например

int i;

char c = 45;

i = ( int )c;

В данном случае значение переменной c явно преобразовывается к типу данных int, а затем уже в преобразованном виде присваивается переменной i.

Вот ещё несколько примеров явного преобразования типов данных

Давайте теперь поэкспериментируем с преобразованием типов данных на практике в реальном коде.

Проект сделаем из проекта MYPROG13 прошлого занятия и имя ему было присвоено MYPROG14.

Откроем файл main.c и в функции main(), как обычно, удалим весь код тела кроме возврата нуля, останется от него вот это

int main()

return 0 ; //Return an integer from a function

Удалим также вот эти константы

#define VAR_CONST1 12345

#define HELLO_CONST «\»Hello, world. \»»

Добавим в тело функции main() следующий код

Источник

Преобразование типов string->double c заданной точностью*?

Есть входящая строка 123456 или 00546.. или любая другая.

Как преобразовать в тип double, чтобы на выходе я получил:
123.456
0.546

Преобразование типов: строки в double
//Дана строка, состоящая из букв, цифр, запятых, точек, знаков ”+” и ”-”. //Вывести подстроку.

Преобразование типов. Откуда берётся double?
Доброго времени суток всем.Объясните кто-нибудь почему компилятор в предупреждениях пишет .

Некорректное преобразование double в int (приведение типов)
Не совсем очевидно. https://ideone.com/7P0EhY #include #include int.

Преобразование типов в C++: как преобразовать строку в тип double?
Здравствуйте помогите пожалуйста, необходимо преобразовать правильно тип то есть b типа double и в.

Самое простое — воспользоваться функцией atof:

Catstail, В С++-то. Агась. stringstream конечно куда тяжелее. Ну и если на то пошло const char*, а не просто char*.

А что, atof в C++ не поддерживается? Вообще-то, методический смысл от того, чтобы вспомнить, какую функцию вызвать — невелик. Для пытливых умов приведу код перевода:

PS:ForEveR, реально хватит кичиться тем что хорошо знаем STL и некоторые примочки плюсов — это не удел знающего человека, а скорее пацана!:negative:
Тогда я скажу — «конечно а sscanf куда сложней чем stringstream»:)

— а ты sscanf попробуй

-=ЮрА=-, Мммм. Предпочитаю в С++ использовать функции С++, а не С и остальным того же советую, как минимум потому, что они типобезопасны (чего не сказать о sscanf, atof и прочих сишных функциях). В частности на тему atof:

То есть как минимум лучше юзать strtod который хоть errno выставляет.

ForEveR, sscanf выбрасывает EOF в случае ошибки:

-=ЮрА=-, Нужная конечно. Когда нужно быстродействие (и то если профайлер показал, что действительно тормоза именно в этом, иначе это экономия на спичках), а в остальных случаях лучше использовать С++-функции.

Преобразование Double в string
Допустим у меня есть число double n = 0.0000000000 мне нужно преобразовать его в строку string s =.

Преобразование string в double
У меня есть массив типа string, в котором хранятся нецелые числа. Надо отсортировать массив по.

Преобразование double в string
Нужно преобразовать double в строку. Знаю про функции ostringstream и stod(), но их проблема в том.

Преобразование из string в double
Объясните пожалуйста в чем связь между преобразованием данный из string в double и библиотекой.

Источник

Поделиться с друзьями
admin
Оцените автора
( Пока оценок нет )
Как переводится?
Adblock
detector