相关疑难解决方法(0)

ProGuard可能导致错误的计算

我遇到了一个非常奇怪的错误.以下一小段代码使用了相当简单的数学.

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个问题:

  1. 怎么会这样?即使ProGuard出错了,计算也应该在设备和会话之间保持一致.

  2. 我们怎能避免它?我知道代double通过long在这种情况下很好,但它是不是一个普遍的方法.删除使用double或发布未混淆的版本是不可能的.

  3. 什么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)

java android proguard android-sdk-tools

9
推荐指数
1
解决办法
382
查看次数

标签 统计

android ×1

android-sdk-tools ×1

java ×1

proguard ×1