我遇到了一个非常奇怪的错误.以下一小段代码使用了相当简单的数学.
protected double C_n_k(int n, int k)
{
if(k<0 || k>n)
return 0;
double s=1;
for(int i=1;i<=k;i++)
s=s*(n+1-i)/i;
return s;
}
Run Code Online (Sandbox Code Playgroud)
编辑使用ProGuard可能会在某些设备上出错.我已经在HTC One S Android 4.1.1 build 3.16.401.8上确认了,但是通过我收到的电子邮件判断,很多Android 4+的手机都受到了影响.对于其中一些(Galaxy S3),美国运营商品牌的手机受到影响,而国际版本则没有.很多手机都没有受到影响.
下面是计算1 <= n <25且0 <= k <= n的C(n,k)的活动代码.在上面提到的设备上,第一个会话给出了正确的结果,但随后的启动显示不正确的结果,每次都在不同的位置.
我有3个问题:
怎么会这样?即使ProGuard出错了,计算也应该在设备和会话之间保持一致.
我们怎能避免它?我知道代double通过long在这种情况下很好,但它是不是一个普遍的方法.删除使用double或发布未混淆的版本是不可能的.
什么Android版本受到影响?我很快就把它固定在游戏中,所以我只知道很多玩家已经看过它了,至少最多有Android 4.0
溢出是不可能的,因为有时我会在计算中看到错误C(3,3)=3/1*2/2*1/3.通常不正确的数字从C(10,...)的某个地方开始,看起来就像电话"忘了"做出一些分歧.
我的SDK工具是22.3(最新的),我在Eclipse和IntelliJ IDEA创建的构建中看到过它.
活动代码:
package com.karmangames.mathtest;
import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;
public class MathTestActivity extends Activity
{
/**
* Called when the activity is first …Run Code Online (Sandbox Code Playgroud)