有一个任务是在不丢失信息的情况下将float值转换为类型值int(一个float值到一个int值),即,这样您就可以执行反向转换。如何实施?
重要的
在这种转换过程中必须保留顺序和总和,
即 对于任何a, b: float应该执行:
to_float(to_int(a) + to_int(b)) == a + b
to_int(a) < to_int(b) при a < b и т.д.
我在英文 SO 上找到了答案,其中float值结构是一点一点表示的,但我无法想象它如何应用于我的任务。
注意:我的任务也不NaN需要inf转换。
解决方案尝试
最初,想到用这些字节序列化pickle.dumps然后int从这些字节中获取,但这根本不是一个合理的解决方案,它根本不满足要求。
已经尝试通过数字的字节表示来实现这一点(Qwertiy♦ 的答案),它不存储总和。
我记得在 python 中整数是无限的。Double的每次幂为11 位,这意味着当乘以 2**(2**12) 时,您会得到一个可以放入 int 的整数。只需要在翻译时相乘,而不是小数 - 否则会发生溢出。
您只需要将浮点数的二进制表示重新解释为整数。
基于https://stackoverflow.com/a/14431225/4928642
基于https://stackoverflow.com/a/58362843/4928642
它不应该。总的来说,它不会证明它可以节省。
而且你不想存储在两个整数中是徒劳的。在 Python 中甚至有一个专门的库。它可以将任何
float数字表示为精确的分数,并以完全自然的方式处理这些数字:最简单的方法是简单地乘以和除以一个足够大的因子以覆盖所需的值范围。
几句话:
现在我得出的结论是不需要 as_integer_ratio,检查
res == 0 and f != 0to_int 就足够了。第一种方式
好在编程中没有无理数:),这意味着任何浮点数都是有理数
因此,它可以表示为分数 - 即 2个号码
int鉴于在python中整数值不限于long,那么一个数中可以有2个数
例如
0,5是[5][10],可以实现这样的存储
第二种方式
float很容易翻译成固定的数字——具有固定点的数字——例如,如果我们假设前 n 个字符是整数部分,而后 m 个字符是小数部分,那么
数字的加法和减法将与 float 或 int 完全相同
数字的比较将与 float 或 int 完全相同
乘法会略有不同 -
浮动到固定翻译:
分别返回
2种方法:
出去
float_long从
long回到float在 Python 熟练之前,请不要重击、踢腿
Java 有一个方法
Float.floatToRawIntBits(),根据 IEEE 754 位定义,它表示整数的位。以此类推,有一个解决办法