我在存储10 ^ 18作为浮点数时遇到问题

时间:2019-10-26 11:48:57

标签: c++ math precision largenumber

我正在编写一个程序,该程序必须采用整数N,其范围为3 <= N <= 10 ^ 18。 这是我必须对N执行的操作之一。

final=((0.5*(pow(2,0.5))*(pow((pow(((N/2)-0.5),2)+pow((N/2)-0.5,2)),0.5)))-0.5)*4;

N保证final包含整数。

问题是我不能以浮点类型存储N,因为它太大了。如果我将其存储在long int int中,答案是错误的(我认为是这样,因为N / 2的中间值会四舍五入)。

2 个答案:

答案 0 :(得分:2)

正确答案是

final = 2 * abs(N-1) - 2;           

这可以通过删除不必要的括号,重新组合相同的术语,通过常数分布乘法以及使用以下标识来验证:

这与接受的答案几乎相同。 但是,其他答案仅对任何N >= 1是正确的。 N-1<0就是错误的,因此对于您的问题0 <= N < 1

,在您的问题允许的N个值范围内

您可以使用此online demo

进行验证

编辑:在您对更改范围的问题进行编辑之后,排除了有问题的值,接受的答案就可以了。我把答案留在这里作记录,也为了数学;-)

答案 1 :(得分:1)

此公式看起来令人生畏,但可以简化为(如果N > 1

final = 4 * (N / 2 - 1)

使用身份:(xa)1/a = x

如果N / 2应该是浮点除法而不是整数除法,则答案是

final = 2 * (N - 2)