Тип double предназначен для представления вещественных чисел (чисел с плавающей точкой или запятой).
- Тип double занимает 64 бита (8 байт). Размер можно узнать командой
std::cout << sizeof(double); //8 (байт)
- Диапазон представляемых значений типом double -1.7E-308 - 1.7E+308, где запись вида xE+N это x умножить на (10 в степени N)
#include <iostream>
#include <limits>
using namespace std;
int main(){
cout << numeric_limits<double>::min() << endl; //2.22507e-308 Минимальное число double
cout << numeric_limits<double>::max() << endl; //1.79769e+308 Максимальное число double
}
Верных значимых десятичных цифр в переменной типа double -15-18. Определено в заголовочном файле limits.
cout << numeric_limits<double>::digits10 << endl; //15 Число значащих десятичных цифр у double
- Для обозначения числа с плавающей точкой двойной точности (double) используется запись типа 3.14 (с точкой и без символа f на конце, с ним - число одинарной точности float 3.14f). Если нет дробных знаков и число как будто целое - точку и ноль нужно добавить, например 32.0.
- Существует тип вещественных чисел как NAN (Not A Number) получающийся в результате ошибочных операций типа деление нуля но ноль или бесконечность на бесконечность и т.д. Для проверки результата работы функций и операций с плавающей точкой на результат NAN служит функция isnan() заголовочного файла cmath.
#include <iostream> // cout
#include <cmath> // isnan()
using namespace std;
int main(){
if(isnan(0.0 / 0.0)){ // Результат деления 0 на 0 будет NAN
cout << "NAN"; //NAN
}
}
- Существует тип вещественных чисел как плюс или минус бесконечность INF (INFINITY) получающийся при переполнении в результате операции, например деления на ноль. Для проверки результата работы функций и операций с плавающей точкой на результат INF служит функция isinf() заголовочного файла cmath.
#include <iostream> // cout
#include <cmath> // isinf()
using namespace std;
int main(){
if(isinf(3 / 0.0)){ // Результат деления на 0 будет INF
cout << "INF"; //INF
}
}
#include <iostream> // stod(), to_string()
#include <cstring> // strcpy()
int main(){
double d1 = std::stod("3.14"); // const char* to double
const char* cpi = "3.14"; // const char*
double d2 = std::stod(cpi); // const char* to double
std::string pi = "3.14"; // std::string
double d3 = std::stod(pi); // std::string to double
std::string s1 = std::to_string(d3); // double to std::string
const char* cch = std::to_string(d3).c_str(); // double to const char*
// Корректно преобразовывать const char* в char* можно только если полученная строка не будет меняться (будет readonly)
char* ch = (char*)std::to_string(d3).c_str(); // double to char* C-style
ch = const_cast<char*>(std::to_string(d3).c_str()); // double to char* C++ style
// Преобразование double в char* который можно изменять
std::string str = std::to_string(d3); // double to std::string
char* buf = new char[str.length() + 1]; // Создаем буфер достаточной длины
std::strcpy(buf, str.c_str()); // Преобразовываем std::string в const char* и копируем в char*
char c = d3; // double to char
short s = d3; // double to short
int i = d3; // double to int
long l = d3; // double to long
long long ll = d3; // double to long long
double d = c; // char to double
d = s; // short to double
d = i; // int to double
d = l; // long to double
d = ll; // long long to double
}