归一化的双重悖论 - 页 2

 
transcendreamer:
模式的打破是,即使在归一化之后,仍然有尾巴!
归一化后没有尾巴......。不要误导人们。
 
VOLDEMAR:
正常化后没有尾巴...不要误导人们。

我不进入....但我有

情况是这样的:我对一个数字进行归一化处理,将其写入终端的一个全局变量,然后读取它,再次进行归一化处理,得到的是尾数

最后--我没有能力抓住这些尾巴--我只是用DoubleToStr(current,2)强行把它们切断。

 
transcendreamer:

我不进入....但我有

情况是这样的:我对一个数字进行归一化处理,将其写入终端的一个全局变量,然后读取它,再次进行归一化处理,得到的是尾数

结果是--没有精力去抓这些尾巴--我只是用DoubleToStr(current,2)把它们强行切下来。

如果你把变量double规范化,比如说,规范化为5个字符,那么这个变量将存储5个字符,在raprinters之类的情况下,你把变量转换为不同的数据类型,这可能导致尾巴。

但归一化后的双倍数没有尾巴...。

为了不出现崩溃,你需要在应用点上做归一化处理,在计算过程中你不必...

 
VOLDEMAR:

例如,如果你将一个双数变量规范化为5位数,该变量将存储5位数,在重新打印和其他事情的情况下,你将该变量转换为其他数据类型,结果可能会出现尾巴。

但归一化后的双倍数中没有尾巴......

为了不发生崩溃,归一化应该在应用点进行,你可能不会在计算过程中进行。

也就是说,如果我做了,比如说,一个转换
(string)current

那么在这个转换过程中,它能准确地给出尾数吗?

不知道

谢谢!

 
transcendreamer:
也就是说,如果我做了,比如说,一个转化的
(string)current

那么在这个转换过程中,它能不能准确地给出尾数?

不知道。

谢谢你!

是的,它可以,DoubleToString(, 5)是正确的。
 
stringo:

NormalizeDouble的工作方式是这样的(从第一个MQL开始就一直是这样工作的)

数字乘以10的幂,转换成整数形式(放弃小数部分),然后再除以10的幂。

这里有什么问题呢?是否有模式中断?

分数部分被扔掉了吗?四舍五入是通过以下方式进行的。

归一化的双(1.25,1) = 1.3

 
Integer:

分数部分是否被丢弃?进行四舍五入。

归一化的双(1.25,1) = 1.3

是的,我忘了提到四舍五入。在得到一个整数时采用四舍五入的方法。
 
transcendreamer:
因此,如果我做,比如说,转换
(string)current

那么在这个转换过程中,它能不能准确地给出尾数?

不知道。

谢谢你

并非如此。二进制系统!=十进制系统。二进制小数位是0.5 / 0.25 / 0.125 / 0.0625 / 0.03125,等等。不可能将这些砖块的所有小数位加起来。例如,不可能把十进制数字0.3精确地拼在一起(你只能拼出一个近似值),在二进制系统中,它要么少一点,要么多一点。这条尾巴就是这样出现的。

只有能无余数地除以1/2^各次方的数字才能被准确表示。

换句话说,当我们试图用二进制形式表示十进制数字时,我们会扭曲数字。

 
这样的一个比喻。
我们已经习惯了这样一个事实,即不准确地写下一个操作的结果,1/3将不得不进行四舍五入。但在三元系统中,有一个确切的运算表示==0.1。如果我们的原生系统是三元制,而电脑使用的是十进制,当把数字0.1troic转换为三元制时,我们会对比特的垃圾感到惊讶。
 
pavlick_:
这样的一个比喻。
我们习惯于不准确写下1/3运算的结果,我们必须四舍五入。但在三元系统中,有一个确切的运算表示==0,1。如果我们的原生系统是三元制,而电脑使用的是十进制,那么当把数字0.1troic转换为三元制时,我们就会对比特的垃圾感到惊讶。

这倒是真的。

但由于某些原因,即使是一分钱的计算器也能从内存中读取一个数字,并准确地返回写在那里的内容。

你写下一个分数1.23,得到的结果正好是1.23,没有任何尾巴。

诀窍就在这里。

理论上说,用户应该不需要以二进制格式呈现数字这样的程序

<bore模式关闭>。