你如何向仍然认为计算机是无限智能和准确的新鲜程序员和外行人解释浮点不准确?
你有一个最喜欢的例子或轶事似乎比一个精确但干燥的解释更好地理解这个想法吗?
这是如何在计算机科学课程中教授的?
是否存在一个IEEE双x>0这样sqrt(x*x) ? x,该计算的情况下x*x不会溢出或下溢到Inf,0或反规范多少?
这给出了sqrt返回最接近的可表示结果,并且同样如此x*x(两者都是IEEE标准规定的,"平方根操作被计算为无限精度,然后四舍五入到指定的两个最接近的浮点数之一)围绕无限精确结果的精度").
假设如果存在这样的双打,那么可能有接近1的例子,我写了一个程序来找到这些反例,并且它找不到任何之间1.0和1.0000004780981346.
以前类似的问题完全平方数和浮点数解答了其中的计算情况下,当负的问题x*x并没有涉及到舍入.这个答案对于这个问题是不够的,因为有可能x*x涉及在一个方向上sqrt(x*x)进行舍入,然后涉及在同一方向上进行舍入,从而产生一个不完全正确的答案x.
我必须检查包含平方根的不等式.为了避免由于浮点不准确和舍入导致的错误结果,我使用std::nextafter()上限/下限:
#include <cfloat> // DBL_MAX
#include <cmath> // std::nextafter, std::sqrt
double x = 42.0; //just an example number
double y = std::nextafter(std::sqrt(x), DBL_MAX);
Run Code Online (Sandbox Code Playgroud)
a)y*y >= x使用GCC编译器保证吗?
b)这是否适用于其他操作+ - * /,甚至std::cos()和std::acos()?
c)是否有更好的方法来获得上限/下限?
更新:我读过这不是C++标准保证的,但应该按照IEEE-754工作.这适用于GCC编译器吗?
是否保证对于static_cast<int>(std::sqrt(x * x)) == x所有正 x 且 x*x 不会溢出?
如果不是,我将如何稳健地计算这些数字的平方根?
在 C++ 中,该sqrt函数仅对double值进行操作。
如果我们使用整数(unsigned long long),我们可以确定
x == sqrt(x * x)
Run Code Online (Sandbox Code Playgroud)
对于任何积极的x地方x * x <= MAXIMUM_VALUE?
它取决于机器架构和编译器吗?
每个人都知道sqrt,从功能math.h/ cmath在C/C++ -它返回它的参数的平方根.当然,它必须有一些错误,因为不是每个数字都可以精确存储.但我保证结果有一定的精确度吗?例如,'它是可以用浮点类型表示的平方根的最佳近似值,or如果你计算结果的平方,它将尽可能接近初始参数使用给定的浮点类型?
C/C++标准有什么关于它的吗?
是否有任何形式的保证 - 无论是在 C++ 标准中还是在其他一些文档中 -cos(x)当使用 g++、clang、MSVC 等编译时,C++ 代码计算将产生相同的值,假设这些实现使用 IEEE-754 64double位和输入值x完全相等?我的假设是“是”,但我想在依赖这种行为之前确认这一点。
背景:我正在教授一门课程,学生可能需要计算输入的三角函数。我可以保证这些输入在输入到函数中时是相同的。我知道平等测试double不是一个好主意,但在这种特定情况下,我想知道这样做是否安全。