GVKun编程网logo

Kahan's Summation Formula原理—它是如何避免大数吃小数的(怎么避免大数吃小数)

18

本篇文章给大家谈谈Kahan'sSummationFormula原理—它是如何避免大数吃小数的,以及怎么避免大数吃小数的知识点,同时本文还将给你拓展@JoinColumnOrFormula(formu

本篇文章给大家谈谈Kahan's Summation Formula原理—它是如何避免大数吃小数的,以及怎么避免大数吃小数的知识点,同时本文还将给你拓展@JoinColumnOrFormula(formula=@JoinFormula org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column、Acumatica PXFormula读取多个表的问题、AN4085, Tips for troubleshooting the MMA865x/MMA845x/MMA8491 Sensor Toolbox Communication Issues ...、Android ScaleAnimation和TranslateAnimation,如何避免ScaleAnimation运动等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Kahan's Summation Formula原理—它是如何避免大数吃小数的(怎么避免大数吃小数)

Kahan's Summation Formula原理—它是如何避免大数吃小数的(怎么避免大数吃小数)

Kahan求和公式原理:

       首先,这个算法就是用来求和的,求a1+a2+a3+...为什么不直接相加呢,而要用Kahan求和公式呢,这个算法的用武之地在哪呢,一一道来

       kahan求和算法能避免大数吃小数的情况。

       大数吃小数是什么意思呢?举个例子,我们用两个float相加,float是32位,它的精度是小数点后6-7位(详见http://www.voidcn.com/article/p-srkjdhyr-bbv.html),设有a=123456;b=2.189;a+b应该是123458.189但是由于float的精度只有小数点后6-7位,所以必然得不到123458.189,后面的89可能会截掉,8不一定,9是必然会截掉的。好的,才做一个加法就产生至少了0.009的误差,做1000个这样的加法,误差就是9了,这显然不是我们想要的。

       kahan求和算法可以避免这种情况,它有一个数用来记住那个被截断的小数,同样做下面的计算,设有a=123456;b=2.189;计算a+b。kahan求和算法是这样做的:sum=a+b(不准确); temp= (a+b)-a-b;temp等于多少呢,初看这不就是0吗?不是的,计算机此时算的可不是0,而是等于-0.009,就是被截断的那个小数。通过一个临时变量我们就记住了这个误差,当计算下一个加法的时候,可以把这个误差补上,并且更新误差到sum。

      其实也可以这样理解,sum不是由于数太大,占用了小数的精度吗,而这个小数在当前一步看似是可以忽略的,但是由于,迭代的次数旁道,小数会累积成大误差,那么我们另外用的float专门记住这个误差小数不就得了吗。

详细的可以看维基百科,不过是英文的

http://en.wikipedia.org/wiki/Kahan_summation_algorithm

Kahan summation algorithm 的具体算法如下:

function KahanSum(input)
    var sum = 0.0
    var c = 0.0          //A running compensation for lost low-order bits.
    for i = 1 to input.length do
        y = input[i] - c    //So far,so good: c is zero.
        t = sum + y         //Alas,sum is big,y small,so low-order digits of y are lost.
        c = (t - sum) - y   //(t - sum) recovers the high-order part of y; subtracting y recovers -(low part of y)
        sum = t             //Algebraically,c should always be zero. Beware eagerly optimising compilers!
        //Next time around,the lost low part will be added to y in a fresh attempt.
    return sum

@JoinColumnOrFormula(formula=@JoinFormula org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column

@JoinColumnOrFormula(formula=@JoinFormula org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column

@JoinColumnOrFormula (formula=@JoinFormula 在 hibernate4.3.11 中报错:

Caused by: java.lang.ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column
    at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:433)
    at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1467)
    at org.hibernate.cfg.annotations.CollectionBinder.bindOneToManySecondPass(CollectionBinder.java:865)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:780)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:729)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:70)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1697)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:439)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1631)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1568)
    ... 75 more

M_CIF_INTERNATIONAL_CHECK

package com.hnair.opcnet.ods.ml.model;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Where;

import com.hnair.opcnet.common.util.DateUtils;

@Entity
@Table(name="M_CIF_INTERNATIONAL_CHECK")
public class M_CIF_INTERNATIONAL_CHECK implements java.io.Serializable {
	private static final long serialVersionUID = -1; 

	@Id 
	@GeneratedValue(strategy = GenerationType.IDENTITY) 
	@Column(name =  "ID") 
	private Long id;
	
	@Column(name =  "SRC_ID") 
	private String srcId;
	@OneToMany(fetch = FetchType.EAGER, mappedBy="check")
//	@Where(clause="DELETED = 0")
	private Set<M_CIF_INTERNATIONAL_CHECK_FILE> checkFile = new HashSet<M_CIF_INTERNATIONAL_CHECK_FILE>(); 

	public void setId(Long id){
		this.id=id;
	}
	public Long getId(){
		return id;
	}
	
	public Set<M_CIF_INTERNATIONAL_CHECK_FILE> getCheckFile() {
		return checkFile;
	}
	public void setCheckFile(Set<M_CIF_INTERNATIONAL_CHECK_FILE> checkFile) {
		this.checkFile = checkFile;
	}
}

M_CIF_INTERNATIONAL_CHECK_FILE

package com.hnair.opcnet.ods.ml.model;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.JoinColumnOrFormula;
import org.hibernate.annotations.JoinColumnsOrFormulas;
import org.hibernate.annotations.JoinFormula;

import com.hnair.opcnet.common.util.DateUtils;

@Entity
@Table(name="M_CIF_INTERNATIONAL_CHECK_FILE")
public class M_CIF_INTERNATIONAL_CHECK_FILE implements java.io.Serializable {
	private static final long serialVersionUID = -1; 

	@Id 
	@GeneratedValue(strategy = GenerationType.IDENTITY) 
	@Column(name =  "ID") 
	private Long id;
	 
	@Column(name =  "SRC_ID") 
	private String srcId;
	
	@ManyToOne(cascade = CascadeType.REFRESH, targetEntity = M_CIF_INTERNATIONAL_CHECK.class)
	@JoinColumnsOrFormulas(value={
			@JoinColumnOrFormula(column=@JoinColumn(name = "CHECKID", referencedColumnName = "SRC_ID", nullable = true, insertable = false, updatable = false))
			,@JoinColumnOrFormula(formula=@JoinFormula(value="0", referencedColumnName = "DELETED"))
			})
	private M_CIF_INTERNATIONAL_CHECK check;
	
	
	 /** 删除标志 */ 
	@Column(name =  "DELETED") 
	private Integer deleted;

	public void setId(Long id){
		this.id=id;
	}
	public Long getId(){
		return id;
	}
	
	 /** 设置 删除标志 */ 
	public void setDeleted(Integer deleted){
		this.deleted=deleted;
	}
	 /** 获取 删除标志 */ 
	public Integer getDeleted(){
		return deleted;
	}
	public M_CIF_INTERNATIONAL_CHECK getCheck() {
		return check;
	}
	public void setCheck(M_CIF_INTERNATIONAL_CHECK check) {
		this.check = check;
	}
}

主表 M_CIF_INTERNATIONAL_CHECK 中使用 @Where (clause="DELETED = 0")

子表 M_CIF_INTERNATIONAL_CHECK_FILE 取消,@JoinColumnOrFormula (formula=@JoinFormula (value="0", referencedColumnName = "DELETED"))

是正常的

Acumatica PXFormula读取多个表的问题

Acumatica PXFormula读取多个表的问题

如何解决Acumatica PXFormula读取多个表的问题?

我正在使用套件行规格上的非持久字段。公式实际上只是数量乘以成本。问题是,std成本保存在InventoryItems表上,但平均或最后成本等却没有。该公式很容易得出标准成本,但事实也很难读取平均成本。我已经尝试了INItemStatsTotal和INItemCost来获取成本和其他工作,还尝试了额外的选择器来做到这一点,尽管标准成本很好,但其他成本却是空白。由于我也将其总计到标题中,因此应该将值的总和推送到标题中,这是在您更改标准成本项目时执行的操作,而不是其他项。下面是一个示例,其中包含多种获取数据的方法-dtd成本是唯一可行的方法。感谢您的帮助。

    [PXFormula(
        //typeof(Mult<Selector<INKitSpecstkDet.compInventoryID,InventoryItem.stdcost>,INKitSpecstkDet.dfltCompQty>),typeof(Mult<Selector<INKitSpecstkDet.compInventoryID,Switch<
                    Case<
                          Where<InventoryItem.valMethod,Equal<INValMethod.standard>>,InventoryItem.stdcost,Case<Where<InventoryItem.valMethod,Equal<INValMethod.average>>,INItemStatsTotal.avgCost
                            //,Selector<INKitSpecstkDet.compInventoryID,INItemCost.avgCost>,Equal<INValMethod.specific>>
                            //,INItemCost.lastCost,INItemStatsTotal.lastCost>,Equal<INValMethod.fIFO>>
                            //,INItemStatsTotal.lastCost>
                            >>>>>>,typeof(SumCalc<INKitSpecHdrExt.usrnpTotalStockCost>))]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

AN4085, Tips for troubleshooting the MMA865x/MMA845x/MMA8491 Sensor Toolbox Communication Issues ...

AN4085, Tips for troubleshooting the MMA865x/MMA845x/MMA8491 Sensor Toolbox Communication Issues ...

【直播预告】程序员逆袭 CEO 分几步?
点击获取完整资源:AN4085, Tips for troubleshooting the MMA865x/MMA845x/MMA8491 Sensor Toolbox Communication Issues - Application Note

Troubleshooting, MMA865x, MMA845x, MMA8491, STB, STB hardware, STB software, STB, Communication Issues, Motion/Freefall status indicator, user interface

点击获取完整资源:AN4085, Tips for troubleshooting the MMA865x/MMA845x/MMA8491 Sensor Toolbox Communication Issues - Application Note

Android ScaleAnimation和TranslateAnimation,如何避免ScaleAnimation运动

Android ScaleAnimation和TranslateAnimation,如何避免ScaleAnimation运动

我有一个ScaleSet,里面有一个ScaleAnimation和一个TranslateAnimation,如下所示:

TranslateAnimation:

TranslateAnimation goTopFromright =
        new TranslateAnimation(0,-(right.getLeft()-top.getLeft()),-(right.getTop()-top.getTop()));

ScaleAnimation:

ScaleAnimation =  setSizeforTop = new ScaleAnimation(1,2,1,2);

和AnimationSet:

bringToLeftFromTopAnimationSet  = new AnimationSet(true);
bringToTopFromrightAnimationSet.addAnimation(goTopFromright);
bringToTopFromrightAnimationSet.addAnimation(setSizeforTop);

问题是,当我尝试仅使用ScaleAnimation时,我的项目会转到我想要的位置,但是当我在AnimationSet中使用ScaleAnimation和TranslateAnimation时,我的项目翻译的次数超出了我的需要,就像ScaleAnimation引入了一些补充一样动作abd我不知道如何删除它们.

谢谢您的帮助.

解决方法

正确的解决方案是改变动画的顺序.规模必须先行:
bringToTopFromrightAnimationSet.addAnimation(setSizeforTop);
bringToTopFromrightAnimationSet.addAnimation(goTopFromright);

我们今天的关于Kahan's Summation Formula原理—它是如何避免大数吃小数的怎么避免大数吃小数的分享就到这里,谢谢您的阅读,如果想了解更多关于@JoinColumnOrFormula(formula=@JoinFormula org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column、Acumatica PXFormula读取多个表的问题、AN4085, Tips for troubleshooting the MMA865x/MMA845x/MMA8491 Sensor Toolbox Communication Issues ...、Android ScaleAnimation和TranslateAnimation,如何避免ScaleAnimation运动的相关信息,可以在本站进行搜索。

本文标签: