最接近 1.0 的双倍是什么,那不是 1.0?
What's the closest double to 1.0, that isn't 1.0?
有没有一种方法可以通过编程获得最接近1.0的double,但实际上不是1.0?
要做到这一点,一种巧妙的方法是将双精度记忆为相同大小的整数,然后减去一。按照IEEE754浮点格式的工作方式,这最终会使指数减少一,同时将小数部分从全零(1 000000000000(更改为全一(1 111111111111(。然而,有些机器的整数存储为小端序,而浮点存储为大端序,因此这并不总是有效的。
由于C++11,您可以使用nextafter
来获得给定方向上的下一个可表示值:
std::nextafter(1., 0.); // 0.99999999999999989
std::nextafter(1., 2.); // 1.0000000000000002
演示
在C和C++中,以下给出了最接近1.0的值:
#include <limits.h>
double closest_to_1 = 1.0 - DBL_EPSILON/FLT_RADIX;
但是,请注意,在C++的后续版本中,limits.h
被弃用,而climits
被弃用。但是,如果你无论如何都在使用C++特定的代码,你可以使用
#include <limits>
typedef std::numeric_limits<double> lim_dbl;
double closest_to_1 = 1.0 - lim_dbl::epsilon()/lim_dbl::radix;
正如Jarod42在他的回答中所写的那样,由于C99或C++11,您也可以使用nextafter
:
#include <math.h>
double closest_to_1 = nextafter(1.0, 0.0);
当然,在C++中,您可以(对于以后的C++版本应该(包括cmath
,而使用std::nextafter
。
在C中,您可以使用以下内容:
#include <float.h>
...
double value = 1.0+DBL_EPSILON;
CCD_ 7是1和可表示的大于1的最小值之间的差。
您需要将其打印到几个数字才能看到实际值。
在我的平台上,printf("%.16lf",1.0+DBL_EPSILON)
给出了1.0000000000000002
。
在C++中,您也可以使用此
1 + std::numeric_limits<double>::epsilon()
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 最接近"std::atomic<std::vector>"是什么?
- C++中最接近 Lua 表操作的东西是什么?
- 什么是从最接近线的一组点找到点的最快算法
- C++最接近追溯定义已定义类的超类是什么?
- 是什么让这个二叉搜索更接近最大范围
- 在 C# 中编写 C++ std::反向等效的最接近的方法是什么?
- 与 Ruby's Rack 最接近C++类似物是什么?
- 使用 opencv 和 c++ 找到与复杂形状最接近的匹配的最佳方法是什么?
- 将货币金额四舍五入到最接近的镍、四分之一、1 美元、5 美元等面额的最佳方法是什么?
- 在C++中,最接近.Net NotSupportedException的替代方案是什么
- 最接近 1.0 的双倍是什么,那不是 1.0?
- 在其他语言中,最接近Apache Hadoop的东西是什么
- 循环遍历数组并找到最接近键的数组元素的最佳方法是什么