修改

开的3年前

关闭3年前

上次修改时间2年前

#3817 关闭 缺陷 (固定的)

Double到Int64类型转换-错误结果

报告人: 阿司匹林瘾君子 所有者: 乔恩
里程碑: 3.3.16.1 组件: AutoIt(自动识别)
版本: 3.3.15.3 严重程度:
关键词: 国际 编号 复写的副本:

说明

以下脚本:

$fN=562949953421312.0美元$iN=整数($fN,2)$iN2=编号($iN,2)控制台写入(“$fN:”&$fN&“(”&VarGetType($fN)&“)”&@CRLF&_“$iN:”&$iN&“(”&VarGetType($iN)&“)”&@CRLF&_“$iN2:”&$iN2&“(”&VarGetType($iN2)&“)”&@CRLF)

生产:

$fN:562949953421312(双倍)
$iN:562949953421313(国际号码64)
$iN2:562949953421313(国际号码64)

这适用于所有大于等于2的整数49存储为双精度。

在IEEE 754双精度中,数字本身可以完全映射,并且没有舍入错误。

实现整数()函数将是C型转换((长-长)fValue))或C++类型转换(static_cast<long long>(fValue)).
然而,这些并没有表现出问题:

#包括<iostream>使用命名空间标准;整型main(){双倍f=562949953421312.0;long-long-iInt1=(long-long)f;long-long iInt2=static_cast<long-long>(f);cout<<iInt1<<“\n”<<iInt2;}

在AutoIt的旧公共源代码中,C转换也用于整数()功能((__int64)m_f值在方法中n64值在文件中variant_数据类型.cpp).
然而,与此同时,这里显然发生了变化。

附件(0)

更改历史记录(5)

注释:1 改变3年前阿司匹林吸毒者

此问题已在此处报告过一次:
https://www.autoitscript.com/trac/autoit/ticket/3703

无论如何,认为这不是一个bug的理由是不正确的。
正如这里所解释的,舍入错误不是原因,因为这些错误应该只发生在253-尚未从2开始49.

此外,C/C++还可以进行这种类型转换-只有在AutoIt中才会产生错误的结果。
所以这个问题一定与AutoIt中的内部处理有关。

上次编辑时间3年前作者:jchd18(以前的)(差异)

注释:2 改变3年前由Jpm提供

检查代码,我发现由于精度损失,较大的正浮点数导致负返回
所以我决定在这种情况下返回最大正整数64

不确定IEEE转换是否兼容,但我不能接受将正浮点数转换为负数,即使它是最大负数。。。

注释:3 改变3年前由Jpm提供

  • 所有者设置为Jpm公司
  • 状态已从更改新的分配

已将修复发送给Jon

注释:4 改变3年前作者:Jon

  • 里程碑设置为3.3.15.4
  • 所有者已从更改Jpm公司乔恩
  • 分辨率设置为固定的
  • 状态已从更改分配关闭

修订版固定[12567]版本:3.3.15.4

注释:5 改变2年前作者:Jon

  • 里程碑已从更改3.3.15.43.3.16.1

通过修订修复[12713]版本:3.3.16.1

发表评论的准则:

  • 您不能重新打开票据,但如果您有其他信息需要添加,您仍然可以留下评论。
  • 应就论坛.

有关更多信息,请参阅完整版本的票务指南在这里.

添加注释

修改票据

行动
已关闭所有者仍将是乔恩。
作者


电子邮件地址和用户名可以保存在偏好.

 
注:请参见TracTickets公司有关使用的帮助门票。