当前位置: 首页 > 面试题库 >

获取行乘积(乘法)

东郭存
2023-03-14
问题内容

所以,

问题

我对行乘法有问题。在SQL中,有一个SUM()函数可以计算一组行中某个字段的总和。我想得到乘法,即表

+ ------ +
| 数据
+ ------ +
| 2 |
| -1 |
| 3 |
+ ------ +

这将是2*(-1)*3 = -6作为一个结果。我正在使用 DOUBLE 数据类型来存储我的数据值。

我的方法

从学校数学知道,log(A x B) = log(A) + log(B)-可以用来创建所需的表达式,例如:

SELECT
  IF(COUNT(IF(SIGN(`col`)=0,1,NULL)),0,
    IF(COUNT(IF(SIGN(`col`)<0,1,NULL))%2,-1,1)
    *
    EXP(SUM(LN(ABS(`col`))))) as product
FROM `test`;

-在这里您会看到此方法的弱点-由于log(X)何时未定义X<=0-我需要在计算整个表达式之前计算负号。该小提琴提供了示例数据和对此的查询。另一个缺点是,我们需要确定列值之间是否为0(因为它是一个样本,所以在实际情况下,我将为某些条件下的表行的子集选择乘积-即,我不能简单地从我的表格中删除0-s,因为结果零积对于某些行子集是有效且预期的结果)

细节

而现在,终于,我的问题主要部分:如何处理的情况时,我们有这样的表达:X*Y*Z在这里X < MAXFY<MAXFX*Y>MAXFX*Y*Z<MAXF-所以我们有可能的数据类型溢出(这里MAXF是限
MySQL数据类型)。示例在这里。上面的查询效果很好,但是我始终可以确定它会正确处理吗?即,当某些子产品引起溢出,但整个产品都正常(无溢出)时,可能还有另一种溢出问题。

还是可能有另一种查找行产品的方法?另外,表中可能有数百万条记录(-1.1<X<=1.1主要是,但可能具有100或1000之类的值,即如果我们遇到上述问题,如果乘以一定数量,则足以溢出
DOUBLE )-可能正在计算通过log会很慢吗?


问题答案:

如果您经常需要这种类型的计算,建议您将符号和对数存储在单独的列中。

这些符号可以存储为1(对于正数),-1(对于负数)和0(对于零)。

可以将对数指定为零0(或任何其他值),但不应在计算中使用它。

那么计算将是:

SELECT 
    CASE WHEN EXISTS (SELECT 1 FROM test WHERE <condition> AND datasign = 0)
         THEN 0
         ELSE (SELECT 1-2*(SUM(datasign=-1)%2) FROM test WHERE <condition>)
    END AS resultsign,

    CASE WHEN EXISTS (SELECT 1 FROM test WHERE <condition> AND datasign = 0)
         THEN -1            -- undefined log for result 0
         ELSE (SELECT SUM(datalog) FROM test WHERE <condition> AND datasign <> 0)
    END AS resultlog
  ;

这样,您就不会出现溢出问题。您可以检查其resultlog是否超出某些限制,或者只是尝试计算resultdata = resultsign *EXP(resultlog)并查看是否引发了错误。



 类似资料:
  • 给定N个数字,范围为-100.100。 要求重新排列元素以使产品价值之和最大。此任务中的乘积和定义为a1*a2+a2*a3..an-1*an 例如,给定数字10 20 50 40 30。 1,-2,3,-4,5,-6,7,-8,9,10,11,12,13,14,15,-16 预期的最大乘积为1342。 我的算法给出了下一个重排:

  • 题目链接 NowCoder 题目描述 给定一个数组 A[0, 1,..., n-1],请构建一个数组 B[0, 1,..., n-1],其中 B 中的元素 B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。要求不能使用除法。 解题思路 // java public int[] multiply(int[] A) { int n = A.length;

  • 问题内容: 我目前正在编写一个小的下载管理器,尝试以百分比计算下载进度时会得到一个有趣的输出。这是我用来计算的: 是一个int(它计算从中读取的总字节数),并且是下载文件的长度(以字节为单位)。 只需少量下载即可很好地工作。但是,当我使用较大的文件(40MB)时,它开始制作有趣的东西。计算的输出如下所示: 我不知道为什么,但是计算结果为负。 由于正常的整数应该可以包含2 31 -1的数字,因此这不

  • 我正在尝试对一个后端服务器进行负载测试,并将一些配置解析到一个标签对象中。我正在尝试生成< code>Label对象的笛卡尔乘积,这将是一个< code>Metric对象。 我有一个 方法添加 我试图以迭代/递归的方式做到这一点,但它变得非常复杂和混乱。我检查了是否有java8替代方案。如果我能够获得

  • 一、题目 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1],不能使用除法。 二、解题思路 B[i]的值可以看作下图的矩阵中每行的乘积。 下三角用连乘可以很容求得,上三角,从下向上也是连乘。 因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来

  • 问题内容: 我有两个numpy数组: 我想形成外部张量积,即numpy数组 这样 我必须多次执行上述外部乘法,所以我想尽可能地加快速度。 问题答案: 另一种方法是显式扩展尺寸。对于一维数组,这将是 对于10x10的数组,并推广维度扩展,我得到了相同的时间 这样确实可以节省一些编码,但是基本的广播乘法是相同的。