Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 长整型不够,双精度';行不通_C++ - Fatal编程技术网

C++ 长整型不够,双精度';行不通

C++ 长整型不够,双精度';行不通,c++,C++,我使用的是C++,我听说并体验到int 和一个long是相同的 但我的问题是,我需要存储一个超过最大值的数字 长度为的变量。double变量的大小已经足够了 但问题是使用double变量 避免我使用运算符%,这是更容易编写函数所必需的,有时也需要这样做 除了使用它,似乎没有其他方法 那么,你能告诉我一个实现我目标的方法吗 您可以使用类型long-long-int或无符号long-long-int 要知道untegral类型可以包含的最大值,可以使用以下构造,例如 std::numeric_lim

我使用的是
C++
,我听说并体验到
int
和一个
long
是相同的

但我的问题是,我需要存储一个超过最大值的数字 长度为
的变量。
double
变量的大小已经足够了

但问题是使用
double
变量 避免我使用运算符
%
,这是更容易编写函数所必需的,有时也需要这样做 除了使用它,似乎没有其他方法


那么,你能告诉我一个实现我目标的方法吗

您可以使用类型
long-long-int
无符号long-long-int

要知道untegral类型可以包含的最大值,可以使用以下构造,例如

std::numeric_limits<long long>::max();
std::numeric_limits::max();

要使用它,必须包括标题

,这取决于用途。为了得到更好的答案,请给我们更多的上下文


看看
(无符号)long-long
或那么,您需要计算大整数的模。99%的可能性是你在做加密,这是很难的事情。你的问题暗示着也许你应该为你的顶级问题(加密)寻找一些现成的解决方案


无论如何,标准答案是使用大精度整数库,例如。

首先,int和long类型之间有区别

但是为了解决您的问题,您可以使用

无符号长整型
#include <cmath>

int main ()
{
    double max_uint = 4294967295.0;
    double max1 = max_uint + 2.0;
    double max2 = (max1 + 1.0) * (max_uint + 1.0);
    double f = fmod(max2,max1);

    return 0;
}
int main() { 双最大值=4294967295.0; 双最大值1=最大值+2.0; 双最大值=(最大值1+1.0)*(最大值+1.0); 双f=fmod(最大值2,最大值1); 返回0; }
max1
max2
都超过了
unsigned int
限制,
fmod
返回正确的
max2%max1
结果,该结果也超过了unsigned int限制:
f==max\u uint+1.0

编辑:

来自anatolyg的好提示:此方法仅适用于2^52以下的整数。这是因为double的尾数有52位,每一个更高的整数只能用精度损失来表示。例如,2^80可以是==(2^80)+1和==(2^80)+2,依此类推。整数越高,精度越高,因为可表示整数的密度在那里越宽


但是,如果您只需要比32位的int多20位,并且没有其他可能通过内置的整数类型实现这一点(我认为使用常规的%会更快),那么您可以使用这个…

下面是一些您在C++中期望的大小列表:

char      : 1 byte
short     : 2 bytes
int       : 4 bytes
long      : 4 bytes
long long : 8 bytes

float  : 4 bytes
double : 8 bytes 

我认为这清楚地解释了您遇到困难的原因,并给出了如何解决这些问题的提示

有符号32位整数的最大值为2147483647。这还不够吗?如果必须的话,可以是unsigned int或int64\u t/uint64\u t。嘿,非常感谢。。这就解决了问题,我要做的就是添加一个int64_t类型的变量。要做到这一点,我必须包括头文件。如果GMP库不适合您的许可需要(不是每个人都可以接受LGPL),还有很多其他的问题。长长不是用C++语言支持的,即使它是可以的,CU不能将积分类型和浮点类型与它们有关存储整数的字节进行比较:即使4字节浮点也可以存储8字节长的长得多的整数,我只添加浮点和双作为参考;答案实际上是指整数类型,我被提醒,float可以存储比long-long更高的整数,但不是完全精确的。只有尾数大小决定,所以float提供2.8字节和双6.5字节(保持在这个比较中)。除了加密之外,大数还有更多的用途!另外,标准答案是
long
,而不是GMP。这种方法有效,但对于较大的值(大于2^52或类似值),它会悄悄地失去精度,这可能是一个令人不快的惊喜。