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

I'm having problem storing 10^18 as a float

我正在编写一个程序,它必须在 3<=N<=10^18 范围内输入一个整数 N。 这是我必须用 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 long int 中,答案是错误的(我认为这是因为 N / 2 的中间值然后四舍五入)。

这个公式看起来很吓人,但可以简化(if N > 1)为

final = 4 * (N / 2 - 1)

使用身份:(x<sup>a</sup>)<sup>1/a</sup> = x.

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

final = 2 * (N - 2)

正确答案是

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

这可以通过删除不必要的括号、重新组合相同的项、按常数分配乘法并使用以下恒等式来验证:

这与接受的答案几乎相同。 但是另一个答案只对 N >= 1 是正确的。一N-1<0就错了,所以在你的问题允许的可能的N值范围内,对于0 <= N < 1

你可以用这个 online demo

来验证

编辑: 在您编辑更改范围的问题并排除有问题的值之后,接受的答案就可以了。为了记录和数学计算,我在这里留下我的答案 ;-)