我需要计算一个表达式,它看起来像:

例如:MAX * MAX - (MAX - 1) * (MAX + 1) == 1,其中MAX = LLONG_MAX - n和n是某个自然数.

推荐答案

我想这似乎太微不足道了. 但A*B是可能溢出的那一个.

您可以执行以下操作,而不会损失精度

A*B - C*D = A(D+E) - (A+F)D
          = AD + AE - AD - DF
          = AE - DF
             ^smaller quantities E & F

E = B - D (hence, far smaller than B)
F = C - A (hence, far smaller than C)

这种分解可以是done further


例如,对于问题中的情况,只需一次迭代,

 MAX * MAX - (MAX - 1) * (MAX + 1)
  A     B       C           D

E = B - D = -1
F = C - A = -1

AE - DF = {MAX * -1} - {(MAX + 1) * -1} = -MAX + MAX + 1 = 1

C++相关问答推荐

VS代码输入需要多次

是否定义了数组指针类型转换为指针类型?""""

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

使用单个字节内的位字段

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

将指针作为参数传递给函数

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

试图从CSV文件中获取双精度值,但在C++中始终为空

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

在txt文件中找到指定的字符串,并从数字中减go 相同的值

如何在c中使用具有不同变量类型的内存分配?

为什么编译器不能简单地将数据从EDI转移到EAX?

为什么WcrTomb只支持ASCII?

用于计算位数和的递归C函数

为什么二进制文件的大小不会随着静态数据的大小而增加?

区分MySQL C界面中的文本和BLOB字段

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题