gpt4 book ai didi

floating-point - "bias value"是什么 float ?

转载 作者:行者123 更新时间:2023-12-03 06:06:34 26 4
gpt4 key购买 nike

在学习 float 在计算机中如何表示时,我遇到了我不太理解的术语“偏差值”。

float 中的偏差值与 float 指数部分的负数和正数有关。

float 的偏置值为127,这意味着 float 的指数部分总是加上127。这样做如何帮助确定指数是负数还是正数?

最佳答案

b0lt 已经解释了偏差的工作原理。猜测一下,也许您想知道为什么他们在这里使用偏差表示,尽管几乎所有现代计算机基本上在其他地方都使用二进制补码(甚至不使用二进制补码的机器,使用补码或符号大小,而不是偏差)。

IEEE 浮点标准的目标之一是您可以将 float 的位视为相同大小的(有符号)整数,如果您以这种方式比较它们,这些值将排序为与它们表示的 float 的顺序相同。

如果您对指数使用二进制补码表示,则一个小的正数(即,具有负指数)看起来像一个非常的整数,因为将设置第二个 MSB。通过使用偏差表示,您就不会遇到这种情况 - float 中较小的指数总是看起来像较小的整数。

FWIW,这也是为什么 float 通常首先排列符号,然后是指数,最后是最低有效位的有效数 - 这样,您可以采用正 float ,将这些位视为整数,并对它们进行排序。当您这样做时,结果将具有正确顺序的 float 。例如:

#include <vector>
#include <algorithm>
#include <iostream>

int main() {
// some arbitrary floating point values
std::vector<double> vals = { 1e21, 1, 2.2, 2, 123, 1.1, 0.0001, 3, 17 };
std::vector<long long> ivals;

// Take those floating point values, and treat the bits as integers:
for (auto &&v : vals)
ivals.push_back(*reinterpret_cast<long long *>(&v));

// Sort them as integers:
std::sort(ivals.begin(), ivals.end());

// Print out both the integers and the floating point value those bits represent:
for (auto &&i : ivals)
std::cout << i << "\t(" << *reinterpret_cast<double *>(&i) << ")\n";
}

当我们运行它时,结果如下所示:

4547007122018943789     (0.0001)
4607182418800017408 (1)
4607632778762754458 (1.1)
4611686018427387904 (2)
4612136378390124954 (2.2)
4613937818241073152 (3)
4625478292286210048 (17)
4638355772470722560 (123)
4921056587992461136 (1e+21)

正如您所看到的,即使我们将它们排序为整数,这些位代表的 float 也按正确的顺序出现。

这对于 float 确实有限制。虽然所有(非古代)计算机都同意正数的表示形式,但(最近)有三种表示形式被用于带符号数:带符号的大小、一个的补码和两个的补码。

只需将这些位视为整数并进行比较,就可以在使用整数的有符号大小表示的计算机上正常工作。对于使用补码或补码的计算机,负数将以相反的顺序排序。由于这仍然是一个简单的规则,因此编写适用于它的代码非常容易。如果我们将上面的 sort 调用更改为如下所示:

std::sort(ivals.begin(), ivals.end(),
[](auto a, auto b) { if (a < 0.0 && b < 0.0) return b < a; return a < b; }
);

...然后它将正确地对正数和负数进行排序。例如,输入:

std::vector<double> vals = { 1e21, 1, 2.2, 2, 123, 1.1, 0.0001, 3, 17, -0.001, -0.00101, -1e22 };

将产生以下结果:

-4287162073302051438    (-1e+22)
-4661071411077222194 (-0.00101)
-4661117527937406468 (-0.001)
4547007122018943789 (0.0001)
4607182418800017408 (1)
4607632778762754458 (1.1)
4611686018427387904 (2)
4612136378390124954 (2.2)
4613937818241073152 (3)
4625478292286210048 (17)
4638355772470722560 (123)
4921056587992461136 (1e+21)

关于floating-point - "bias value"是什么 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2835278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com