我刚开始踏实,我在类型问题上遇到了一些麻烦。我正在尝试执行以下功能:
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利用以下函数来转换数字:
def toFixedPoint64(x):
x = x * (2**64)
y = round(x + 0.5)
return y现在,假设我想转换以下浮点数数组:
[0.52,0.49,-0.20,0.57]产生的数组将是:
[9592306918328967168, 9038904596117680128, -3689348814741910528, 10514644122014443520]当我将这个数组输入到sigmoid函数时,我得到了以下错误:
错误编码参数:错误:无效数字值(arg="",coderType="int128",value=9592306918328967000,version=4.0.44)
我不明白为什么我会有这个问题,实际上,使用int128,我应该能够代表这个问题的更高的值。我也不明白为什么这个数字会减少到9592306918328967000。假设我把数字9592306918328967168输入到sigmoidSingle函数中,我没有遇到任何问题,相反,它返回正确的结果。现在,我怀疑这个问题可能是由数组引起的,但是由于我不是一个可靠的专家,所以我不知道该怎么想。有谁能帮我了解情况吗?
更新:这是VM模拟器的一个问题。给出被引号包围的数字应该是可行的。示例:"9592306918328967168“是将此int128输入到Remix的正确方法。
发布于 2020-04-11 18:58:31
在Python2上,round()函数返回一个浮点数(参见这里)。
切换到Python3,或者使用int(round(x + 0.5))代替。
发布于 2020-07-03 12:56:45
把所有的数字放入双引号:
[ "9592306918328967168",
"9038904596117680128",
"-3689348814741910528",
"10514644122014443520" ]因为您的数字太大,无法表示为JSON数字。
对于这些引用的值,sigmoid函数的输出如下:
11568834341578123390, // 0.627147766313195582813
11438944655894070866, // 0.620106432343090129282
8304097042261566175, // 0.450166002687522088675
11783100815680795823 // 0.638763175148841909118此外,您的代码存在安全问题,因为-x不安全,可能导致溢出。你最好用ABDKMath64x64.neg(x)代替。
顺便说一下,您可以使用ABDK工具包将数字转换为/从64.64格式。
我是这个ABDKMath64x64库的作者。
https://ethereum.stackexchange.com/questions/82378
复制相似问题