Big number multiplication 大整数乘法

本文介绍了一种基于数组的大数乘法算法实现方法。通过定义一个结构体来存储大数,并实现了一个乘法函数,该函数能够处理两个大数的乘法运算。此算法适用于需要进行精确大数运算的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const int N=1100;

struct BigNum{
  
int front;
  
int data[N+1];
}
;

BigNum
& Mulit(BigNum up, BigNum down){
  
int i,k,carry,v;
  BigNum prod;
  prod.front
=up.front+down.front-N+1;
  
for(i=prod.front;i<=N;i++)prod.data[i]=0;
  
for(i=N;i>=down.front;i--){
    BigNum tmp;
    carry
=0;
    
for(k=N;k>=up.front;k--){
      v
=down.data[i]*up.data[k]+carry;
      tmp.data[k]
=v%10;
      carry
=v/10;
    }

    tmp.front
=up.front;
    
if(carry>0) tmp.data[--tmp.front]=carry;
    carry
=0;
    
for(k=N;k>=tmp.front;k--){
      v
=tmp.data[k]+prod.data[i+k-N]+carry; // when i==N, k to k, then i is decreased 1 each step.
      prod.data[i+k-N]=v%10;
      carry
=v/10;
    }

    
while(carry>0){
      v
=prod.data[i+k-N]+carry;
      prod.data[i
+k-N]=v%10;
      carry
=v/10;
      k
--;
    }

  }

  
while(prod.data[prod.front]==0 && prod.front<N) prod.front++;
  
return prod;
}

//30'
 
### FP32 浮点数乘法运算方法 在 IEEE 754 标准下,FP32(单精度浮点数)由三部分组成:1位符号位、8位指数位以及23位尾数位。当执行两个 FP32 数字相乘时,主要遵循以下过程: #### 符号处理 最终结果的符号取决于参与操作数的符号。如果两者的符号相同,则结果为正;反之则负。 #### 指数计算 将两个操作数各自的偏置后的指数值相加,并从中减去一个固定的偏置量 (通常是127),以此获得新的指数值[^1]。 #### 尾数相乘 去除隐含的最高有效位 '1' 后,直接把两个尾数当作纯整数值来进行二进制乘法得到初步积。由于每个原始因子都有隐藏前导 '1', 所以实际上是在做 \(M_1 \times M_2\) 的运算,其中\(M_i=1+F_i\)[^2]。 #### 归一化与舍入 所得乘积累加可能超出原本表示范围,此时需调整其格式使之符合标准规定的形式。这通常涉及到左移或右移动并适当截断多余低位来保持精度的同时满足规格化的条件。最后一步是对中间产物实施四舍五入规则以便适应有限长度的目标字段。 以下是 Python 中模拟上述流程的一个简单例子: ```python import struct def float_to_bin(value): """Convert a floating point number to its binary representation.""" [d] = struct.unpack(">Q", struct.pack(">f", value)) return f'{d:032b}' def bin_to_float(b): """Convert a string of bits back into a floating-point number.""" bf = int(b, 2).to_bytes(4, "big") return struct.unpack('>f', bf)[0] def fp32_multiply(a, b): # Convert floats to their bit representations as strings. abits = float_to_bin(a) bbits = float_to_bin(b) # Extract sign, exponent and mantissa from both numbers. asign = (-1)**int(abits[0]) bsignd = (-1)**int(bbits[0]) aexp = int(abits[1:9], 2) - 127 bexp = int(bbits[1:9], 2) - 127 amantissa = int('1'+abits[9:], 2) bmantissa = int('1'+bbits[9:], 2) # Perform multiplication on the mantissas. product_mantissa = amantissa * bmantissa >> 23 # Calculate new exponent after adding exponents together. result_exp = aexp + bexp + 127 # Combine results according to IEEE-754 rules. final_result_bits = format(int(asign*bsignd<0), '01b') \ + format(result_exp & ((1 << 8)-1), '08b') \ + format(product_mantissa & ((1 << 23)-1), '023b') return bin_to_float(final_result_bits) # Example usage: result = fp32_multiply(-1.5, 2.0) print(f"The result is {result}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值