首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误编码参数:错误:无效数字值(arg="",coderType="int128",value=9223372036854776000,version=4.0.44)

错误编码参数:错误:无效数字值(arg="",coderType="int128",value=9223372036854776000,version=4.0.44)
EN

Ethereum用户
提问于 2020-04-11 17:08:47
回答 2查看 530关注 0票数 0

我刚开始踏实,我在类型问题上遇到了一些麻烦。我正在尝试执行以下功能:

代码语言:javascript
复制
function sigmoidSingle(int128 x) public pure returns(int128)
{
    //The sigmoid function is f(x) = 1 / (1 + e^(-x))
    x =  ONE + ABDKMath64x64.exp(-x);
    int128 y = ABDKMath64x64.div(ONE,x);
    return y;
    
}

//Sigmoid activation function to process a np array
function sigmoid(int128[] memory x) public pure returns(int128[] memory)
{
    uint xSize = x.length;
    int128[] memory y_Preds = new int128[](xSize);
    
    for(uint8 i = 0; i < xSize; i++ )
    {
         y_Preds[i] =  sigmoidSingle(x[i]);
    }
   
    
    return y_Preds;
}

其中sigmoid函数的输入数组x是64.64不动点格式数字的数组。我正在使用Python利用以下函数来转换数字:

代码语言:javascript
复制
def toFixedPoint64(x):
    x = x * (2**64)
    y = round(x + 0.5)
    return y

现在,假设我想转换以下浮点数数组:

代码语言:javascript
复制
[0.52,0.49,-0.20,0.57]

产生的数组将是:

代码语言:javascript
复制
[9592306918328967168, 9038904596117680128, -3689348814741910528, 10514644122014443520]

当我将这个数组输入到sigmoid函数时,我得到了以下错误:

错误编码参数:错误:无效数字值(arg="",coderType="int128",value=9592306918328967000,version=4.0.44)

我不明白为什么我会有这个问题,实际上,使用int128,我应该能够代表这个问题的更高的值。我也不明白为什么这个数字会减少到9592306918328967000。假设我把数字9592306918328967168输入到sigmoidSingle函数中,我没有遇到任何问题,相反,它返回正确的结果。现在,我怀疑这个问题可能是由数组引起的,但是由于我不是一个可靠的专家,所以我不知道该怎么想。有谁能帮我了解情况吗?

更新:这是VM模拟器的一个问题。给出被引号包围的数字应该是可行的。示例:"9592306918328967168“是将此int128输入到Remix的正确方法。

EN

回答 2

Ethereum用户

发布于 2020-04-11 18:58:31

在Python2上,round()函数返回一个浮点数(参见这里)。

切换到Python3,或者使用int(round(x + 0.5))代替。

票数 0
EN

Ethereum用户

发布于 2020-07-03 12:56:45

把所有的数字放入双引号:

代码语言:javascript
复制
[ "9592306918328967168",
  "9038904596117680128",
  "-3689348814741910528",
  "10514644122014443520" ]

因为您的数字太大,无法表示为JSON数字。

对于这些引用的值,sigmoid函数的输出如下:

代码语言:javascript
复制
11568834341578123390, // 0.627147766313195582813
11438944655894070866, // 0.620106432343090129282
8304097042261566175,  // 0.450166002687522088675
11783100815680795823  // 0.638763175148841909118

此外,您的代码存在安全问题,因为-x不安全,可能导致溢出。你最好用ABDKMath64x64.neg(x)代替。

顺便说一下,您可以使用ABDK工具包将数字转换为/从64.64格式。

我是这个ABDKMath64x64库的作者。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/82378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档