直接乘和使用pow这两次计算结果为什么不一样

乐百川 2015-04-16 06:55:27
import java.math.BigInteger;
public class Sample{
public static void main(String []args){
f1();
f2();
f3();
f4();
}
static void f1(){
BigInteger sum=BigInteger.valueOf(0);
BigInteger factor=null;
for(int i=1;i<=15;++i){
factor=BigInteger.valueOf(1);
for(int j=0;j<i;++j){
factor=factor.multiply(BigInteger.valueOf(i));
}
sum=sum.add(factor);
}
System.out.println(sum);
}
static void f2(){
long sum=0;
long factor=0;
for(int i=1;i<=15;++i){
factor=1;
for(int j=0;j<i;++j){
factor*=i;
}
sum+=factor;
}
System.out.println(sum);
}
static void f3(){
long sum=0;
for(int i=1;i<=15;++i){
sum+=Math.pow(i,i);
}
System.out.println(sum);
}
static void f4(){
double sum=0;
for(int i=1;i<=15;++i){
sum+=Math.pow(i,i);
}
System.out.println((long)sum);
}
}
一和二结果一样,三和四结果一样,但是两者为什么不一样呢
...全文
789 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
finemi 2015-04-24
  • 打赏
  • 举报
回复
BigDecimal 可以精确运算
乐百川 2015-04-17
  • 打赏
  • 举报
回复
引用 5 楼 qq118194716 的回复:
1 5 32 288 3413 50069 873612 17650828 405071317 10405071317 295716741928 9211817190184 312086923782437 11424093749340453 449317984130199828 1 5 32 288 3413 50069 873612 17650828 405071317 10405071317 295716741928 9211817190184 312086923782437 11424093749340452 449317984130199872 -44 前面一个是准确的 后面一个是有误差的 前13次都没有误差 到第14次开始出现误差 误差的出现是在于double的出现 Math.pow(i,i)使用了double来表示 而double有效位只有15位,意思是如果 超过了15位,后面的尾巴就会被忽略掉 你这个最高到了17位,忽略掉几十很正常~
嗷嗷,非常感谢
飏飏一蝶 2015-04-16
  • 打赏
  • 举报
回复
1 5 32 288 3413 50069 873612 17650828 405071317 10405071317 295716741928 9211817190184 312086923782437 11424093749340453 449317984130199828 1 5 32 288 3413 50069 873612 17650828 405071317 10405071317 295716741928 9211817190184 312086923782437 11424093749340452 449317984130199872 -44 前面一个是准确的 后面一个是有误差的 前13次都没有误差 到第14次开始出现误差 误差的出现是在于double的出现 Math.pow(i,i)使用了double来表示 而double有效位只有15位,意思是如果 超过了15位,后面的尾巴就会被忽略掉 你这个最高到了17位,忽略掉几十很正常~
乐百川 2015-04-16
  • 打赏
  • 举报
回复
我好像没说明白,这四个函数都是求1^1+2^2+...+n^n的和的,但是我自己乘i次和直接用pow的结果却有一些误差,所以想搞清楚怎么回事,这是结果
449317984130199828
449317984130199828
449317984130199872
449317984130199872
Tony-devj 2015-04-16
  • 打赏
  • 举报
回复
首先你要弄清楚pow的含义,在来进行的对比。再将两个值打出来你就知道他们是怎么算的。
Coder_D 2015-04-16
  • 打赏
  • 举报
回复
不是代码问题,数学没过关
scmod 2015-04-16
  • 打赏
  • 举报
回复
pow好像是i的i次方 上面俩好像是阶乘
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧