【问题标题】:Converting linear scale to log scale in java在java中将线性比例转换为对数比例
【发布时间】:2018-05-22 14:36:20
【问题描述】:

我查看并找到了一篇对我有帮助的帖子: Convert Linear scale to Logarithmic

但是我要么犯了一些我找不到的错误,要么我对公式有错误的想法。如果它是对数刻度,我想将线性 1-256 范围内的任何数字转换为它们各自的值。有人可以帮我更正我的代码吗?当我尝试从零开始的低值时,它工作得很好,但尝试转换任何超过 160 的值都会得到 > 256 的结果。 这是我的代码:

package linear2log;

public class Linear2Log {

    public static void main(String[] args) {

        System.out.println("Ats3: " + lin2log(160));
    }

    public static long lin2log(int z) {
        int x = 1;
        int y = 256;
        double b = Math.log(y/x)/(y-x);
        double a = 10 / Math.exp(b*10);
        double tempAnswer = a * Math.exp(b*z);
        long finalAnswer = Math.max(Math.round(tempAnswer) - 1, 0);

        return finalAnswer;
    }
}

【问题讨论】:

  • 这几乎可以肯定是 int 数学错误。将您所有的 ints 更改为 double 应该可以解决您的问题。
  • 对于示例中给出的值 x 和 y,情况并非如此。这可能是其他值的问题。此行有潜在危险:double b = Math.log(y/x)/(y-x);

标签: java logarithm


【解决方案1】:

你把公式弄错了。

确定这一行

double a = 10 / Math.exp(b*10);

您使用的是示例中的值 10,但您应该使用的值是 256。

double a = y / Math.exp(b * y);

我不明白你为什么要使用这条线:

 long finalAnswer = Math.max(Math.round(tempAnswer) - 1, 0);

这样你总是得到比实际价值小一的价值。

【讨论】:

  • 哦,谢谢,我修好了那条线,显然这是罪魁祸首。我想为 RGB 获取 0 到 255 的值,但我不能将 0 插入(y/x),这就是我稍后减去 1 的原因。我的功能是用于基本操作一个颜色通道。
猜你喜欢
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多