当前位置: 首页 > 知识库问答 >
问题:

C半库对正数的精度较低

湛鸿
2023-03-14

我知道我正在使用未内置在 c 中的功能,但是,这个库似乎非常常用,以至于我很惊讶地看到弹出此错误。

对于那些不了解图书馆的人,可以在这里找到它。从本质上讲,它应该允许支持 16 位浮点(较低精度)数字。

我的问题是,对于正数,半浮点数的精度似乎会降低。

在这段代码中,我生成了一堆要渲染到屏幕上的点。{xs1,ys1}表示sigmoid的浮点精度计算。{xs3,ys3}表示转换为浮点精度的值。

vector<float> xs1, ys1, xs3, ys3;
int res = 200000;
for (int i = 0; i < res; i++)
{
    float prec = float(i) / float(res);
    float fx = ((perc - 0.5) * 2.0)*8.0;
    half hx = half(fx);
    float fy = MFunctions::sigmoid(fx);
    half hy = half(fy);

    xs1.push_back(fx);
    ys1.push_back(fy);

    xs3.push_back(float(hx));
    ys3.push_back(float(hy));
}

以下是结果(查看窗口宽度为2.2个单位、窗口高度为0.02个单位时生成的图形的放大部分):

我不知道为什么会发生这种情况,因为正数和负数之间的唯一区别应该是符号位。

是我做错了什么,还是这是半图书馆的缺陷?

共有1个答案

范宏大
2023-03-14

Sigmoid函数的输出值为[0;1],因此您看到的是正常的:在底部图片中,值大约为1,因此精度远低于0。

 类似资料:
  • 问题内容: 是否在任何地方都有Java库可以对IEEE 754半精度 数字执行计算或将其与双精度数字进行转换? 这些方法中的任何一种都是合适的: 将数字保持为半精度格式,并使用整数算术和位扭曲(如MicroFloat的单精度和双精度)进行计算 以单精度或双精度执行所有计算,转换成半精度以进行传输(在这种情况下,我需要经过良好测试的转换函数。) 编辑 :转换需要100%准确- 输入文件中 有 很多N

  • 嗨,我必须开发一个应用程序来读取OCR数据。 谷歌后,我发现我可以实现它使用魔方。 我从https://github.com/rmtheis/tess-two获得了Tesseract源代码 如果有人做得对的话请帮帮我... 提前多谢了....

  • 本文向大家介绍半小时精通正则表达式-精华版,包括了半小时精通正则表达式-精华版的使用技巧和注意事项,需要的朋友参考一下 虽然呐喊教程以前发不过不少的正则表达式教程,但这篇文章还是不错的,无废话都是比较实际的,前提就是需要你之前懂点正则表达式,要不还是先看些基本的正则表达式教程比较好。

  • 问题内容: 我正在尝试使用包含大量16位浮点数的javascript读取二进制文件。可以肯定的是它是IEEE标准,低位字节序。将两个字节读入一个int非常简单,但是从那里将其扩展为一个完整的浮点数并没有太大的成功。有什么线索吗? 问题答案: 我最终根据Wikipedia页面上的信息实现了自己的解析器。它可能不是最快的,但是我对此不太担心。这里是那些好奇的人:

  • 我提出了一些基于机器学习的算法,该算法基于树莓pi 3,具有大量存储系数数组,不需要完全精度。 我尝试使用半精度浮点来存储这些数据,以减少程序内存(可能还有内存带宽)占用。 算法的其余部分保持不变。 在使用时,我比较了flat32和flat16版本的性能损失(显著的:我测试程序的33%运行时),尽管cpu应该支持转换。 我查看了asembler输出,还创建了一个sinple函数,该函数只读取一个值

  • 问题内容: 我有一个JUnit测试失败,因为毫秒不同。在这种情况下,我不在乎毫秒。如何更改断言的精度以忽略毫秒(或我希望将其设置为任何精度)? 我想通过的断言示例: 问题答案: 使用具有仅显示您要匹配的部分的格式的对象,并对所得的字符串进行处理。您还可以轻松地将其包装在自己的方法中。

  • 问题内容: 我正在寻找比较应该相同的两个数据框。但是,由于浮点精度,我被告知值不匹配。我在下面创建了一个示例进行模拟。如何获得正确的结果,以便最终比较数据帧对两个单元格都返回true? 问题答案: 好的,您可以为此使用: 需要相对公差和绝对公差。这些有默认值:,分别

  • 为什么浮点数据类型的精度不与其大小成正比增长?例如: 正如您所看到的,的精度大约是精度的两倍,这是有意义的,因为的大小是。 但这与双精度和长双精度的情况不同,长双精度的大小是128位,是64位双精度的两倍,但其精度只多出三位!! 我不知道浮点数是如何实现的,但从理性的角度来看,仅为三位精度使用64位内存是否有意义?! 我四处搜索,但没有找到一个简单明了的答案。如果有人能解释为什么长双精度只比双精度