gpt4 book ai didi

java - 在不损失精度的情况下转换 float 的基数

转载 作者:太空狗 更新时间:2023-10-29 22:57:31 24 4
gpt4 key购买 nike

术语

在这个问题中,我将“ float ”称为“十进制数”,以防止与 float/double Java 基本数据类型产生歧义。术语“十进制”与“以 10 为底”没有任何关系。

背景

我用这种方式表示任何基数的十进制数:

class Decimal{
int[] digits;
int exponent;
int base;
int signum;
}

它大致表达了这个double值:

public double toDouble(){
if(signum == 0) return 0d;
double out = 0d;
for(int i = digits.length - 1, j = 0; i >= 0; i--, j++){
out += digits[i] * Math.pow(base, j + exponent);
}
return out * signum;
}

我知道有些转换是不可能的。例如,无法将 0.1 (base 3) 转换为 base 10,因为它是循环小数。类似地,将 0.1 (base 9) 转换为 base 3 是不可能的,但是转换 0.3 (base 3) 是可能的。可能还有其他我没有考虑过的情况。

传统方式

对于整数,从 10 进制到 2 进制的传统换底方式是将数字除以 2 的指数,从 2 到 10 是将数字乘以相应的数字2 的指数。从基数 x 更改为基数 y 通常涉及转换为基数 10 作为中间值。

第一个问题:参数验证

因此,我的第一个问题是,如果我要实现 public Decimal Decimal.changeBase(int newBase) 方法,我如何验证 newBase 是否可以生成而不会导致循环小数(这与 int[] digits 字段的设计不兼容,因为我不打算为此制作一个 int recurringOffset 字段。

第二个问题:实现

那么,如何实现呢?我本能地觉得,如果第一个问题解决了,这个问题就更容易解决了。

第三个问题:循环数字输出怎么样:

I don't plan to make an int recurringOffset field just for this.

为了 future 的读者,这个问题也应该被问到。

例如,根据Wolfram|Alpha :

0.1 (base 4) = 0.[2...] (base 9)

如何计算(手工计算,如果编程听起来太复杂)?

我认为像这样的数据结构可以表示这个十进制数:

class Decimal{
int[] constDigits;
int exponent;
int base;
int signum;
@Nullable @NonEmpty int[] appendRecurring;
}

例如,61/55可以这样表达:

{
constDigits: [1, 1], // 11
exponent: -1, // 11e-1
base: 10,
signum: 1, // positive
appendRecurring: [0, 9]
}


不是作业题

我不是在寻找任何图书馆。请不要引用任何库来回答这个问题。(因为我写这个类只是为了好玩,好吗?)

最佳答案

对于您的第一个问题:只要旧基数的质因数也在新基数的质因数中,您总是可以转换而不会变成周期性的。例如,每个以 2 为底数的数字都可以精确地表示为以 10 为底数。不幸的是,这个条件是充分的,但不是必需的,例如有一些以 10 为底数的数字,如 0.5,可以精确地表示为以 2 为底数,尽管 2 没有质因数5.

当您将数字写成分数并将其简化为最低项时,当且仅当分母仅具有也出现在 x 中的质因数(忽略质数的指数)时,它可以在基数 x 中没有周期性部分的情况下精确表示。

例如,如果您的数字是 3/25,您可以在每个具有质因数 5 的底数中准确表示它。即 5、10、15、20、25,...

如果数字是 4/175,分母有质因数 5 和 7,因此可以精确地表示为 35、70、105、140、175,...

对于实现,您可以在旧基数(主要做除法)或新基数(主要做乘法)中工作。我会避免在转换过程中经过三垒。

由于您在问题中添加了周期性表示,转换的最佳方法似乎是将原始表示转换为分数(这总是可以完成,也适用于周期性表示),然后通过执行将其转换为新的表示部门。

关于java - 在不损失精度的情况下转换 float 的基数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38697852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com