Поскольку pow
принимает значение с плавающей запятой в качестве первого аргумента, я бы предложил компилятору выбрать правильное продвижение, добавив разницу к 0.0
(или 0.0L
) :
#include <iostream>
#include <cstdint>
#include <cmath>
using namespace std;
int main()
{
std::string name;
/// 52 of 64 bits used
uint64_t n1 = 0x000ffffffffffffd;
uint64_t n2 = 0x000fffffffffffff;
cout << "plain: " << n1 - n2 << endl;
cout << "float: " << (float)n1 - (float)n2 << endl;
cout << "double: " << (double)n1 - (double)n2 << endl;
cout << "long double: " << (long double)n1 - (long double)n2 << endl;
cout << "0.0+: " << 0.0 + n1 - n2 << endl;
cout << "0.0L+: " << 0.0L + n1 - n2 << endl;
cout << "pow(plain, 2): " << pow(n1-n2, 2) << endl;
cout << "pow(0.0+diff, 2): " << pow(0.0+n1-n2, 2) << endl;
cout << "pow(0.0L+diff, 2): " << pow(0.0L+n1-n2, 2) << endl;
}
Вывод
plain: 18446744073709551614
float: 0
double: -2
long double: -2
0.0+: -2
0.0L+: -2
pow(plain, 2): 3.40282e+38
pow(0.0+diff, 2): 4
pow(0.0L+diff, 2): 4
показывает, что обычное вычитание идет не так. Даже приведение к float
не достаточно, потому что float
предоставляет только 23-битную мантиссу.
Решение о том, использовать ли 0.0
или 0.0L
для различий size_t
значений, возвращаемых реальнымstd::vector::size()
вызовов является теоретическим для процессов с адресным пространством ниже 4,5 петабайт.
Поэтому я думаю, что подойдет следующее:
cout << pow(0.0 + G[1].size() - G[0].size(), 2) << endl;