C+中的最小浮点正值+; 在C++中,它们的乘性逆仍然是有限的最小正值是什么? 我试过数值限制::epsilon()但不是这样-我得到了比这个小得多的正值 #include <limits>//is it here? void tfuuuuu() { double d_eps,invd_eps; float f_eps,invf_eps; invd_eps = 1.0/d_eps;//invd_eps should be finite invf_eps = 1.f/f_eps;//invf_eps should be finite } \include//在这里吗? void tfuuuu() { 双d_每股收益,投资收益; 浮动每股收益、投资每股收益; invd_eps=1.0/d_eps;//invd_eps应该是有限的 invf_eps=1.f/f_eps;//invf_eps应该是有限的 }

C+中的最小浮点正值+; 在C++中,它们的乘性逆仍然是有限的最小正值是什么? 我试过数值限制::epsilon()但不是这样-我得到了比这个小得多的正值 #include <limits>//is it here? void tfuuuuu() { double d_eps,invd_eps; float f_eps,invf_eps; invd_eps = 1.0/d_eps;//invd_eps should be finite invf_eps = 1.f/f_eps;//invf_eps should be finite } \include//在这里吗? void tfuuuu() { 双d_每股收益,投资收益; 浮动每股收益、投资每股收益; invd_eps=1.0/d_eps;//invd_eps应该是有限的 invf_eps=1.f/f_eps;//invf_eps应该是有限的 },c++,precision,C++,Precision,以下是回答您问题的起点。我只是除以2。一旦除以2^^148,就非常接近了。然后,您可以迭代地靠近并打印出数字的十六进制表示形式,以查看编译器正在执行的操作: #包括 #包括 #它在这儿吗? int main(){ 双d_每股收益,投资收益; 浮动每股收益、投资每股收益; invf_eps=1.f/f_eps;//invf_eps应该是有限的 浮动最后一个种子=0; 漂浮种子=1.0; 对于(int i=0;i

以下是回答您问题的起点。我只是除以2。一旦除以2^^148,就非常接近了。然后,您可以迭代地靠近并打印出数字的十六进制表示形式,以查看编译器正在执行的操作:

#包括
#包括
#它在这儿吗?
int main(){
双d_每股收益,投资收益;
浮动每股收益、投资每股收益;
invf_eps=1.f/f_eps;//invf_eps应该是有限的
浮动最后一个种子=0;
漂浮种子=1.0;
对于(int i=0;i<1000000;i++){
最后的种子=种子;
种子=种子/2;
如果(种子/2==invd_eps){
printf(“在i=%d\n,i处断开);
printf(“种子:%g,最后一个种子:%g\n”,种子,最后一个种子);
打破
}
}
printf(“%f,%lf,%f,%lf\n\n”,f\u每股收益,d\u每股收益,invf\u每股收益,invd\u每股收益);
返回0;
}
输出:

Breaking at i = 148
Seed:  1.4013e-45, last seed: 2.8026e-45
0.000000, 0.000000, inf, 0.000000


Process finished with exit code 0

我怀疑是否存在用于查找所需数字的标准库函数,但是,使用简单的二进制搜索查找所需值并不太难:

#include <iostream>
#include <cmath>
#include <typeinfo>

template<typename T> T find_magic_epsilon(T from, T to) {
    if (to == std::nextafter(from, to)) return to;
    T mid = (from + to)/2;
    if (std::isinf((T)1.0/mid)) return find_magic_epsilon<T>(mid, to);
    else return find_magic_epsilon<T>(from, mid);
}

template<typename T> T meps() {
    return find_magic_epsilon<T>(0.0, 0.1);
}

template<typename T> T test_meps() {
    T value = meps<T>();
    std::cout << typeid(T).name() << ": MEPS=" << value
              << " 1/MEPS=" << (T)1.0/value << " 1/(MEPS--)="
              << (T)1.0/std::nextafter(value,(T)0.0) << std::endl;
}

int main() {
    test_meps<float>();
    test_meps<double>();
    test_meps<long double>();
    return 0;
}

你有没有检查过标题中的内容?@eozd-是的,我看到的唯一可能的值是numeric_limits::epsilon(),但它肯定不是我要找的。根据IEEE 754标准,单精度浮点在32位上编码,带有符号位、分数和指数。您可以拥有的最小正值为2^(-126)。(也可以表示它的逆2^126)@einpoklum-已经尝试过了,但我假设它不是泛型的(即特定于平台、特定于编译器等),所以我正在寻找泛型的东西,可能是语言标准的一部分。
std::numeric_limits::epsilon()
给出
1.0
和下一个可表示值之间的差异。对于具有非规范化的浮点类型
std::numeric_limits::min()
生成最小的规范化值,而不是(一定)所有正值中的最小值。C++17头
有一个宏值
DBL\u TRUE\u MIN
用于
double
(和其他浮点类型的类似宏),但这尚未反映在
中。如果没有这些宏,计算它的技术取决于浮点表示法……你被零除,然后就可以逃脱吗?O.0是IEEE浮点数的正常操作,因此产生一个“无穷大”值。此外,你可以除以负零(一个单独的值),你会得到负无穷大-有趣,对吗?但是,如果您对这种做法感到不安(这是一个完全合理的担忧),那么应该使用numeric_limits::infinity()来代替。事实上,std::isinf可能是检查无穷大的更好方法。修复了那里的代码。我看到后不敢运行你的代码。我当然不会!这就是为什么我在答案中包含了输出-对于那些不敢的人!;)
f: MEPS=2.93874e-39 1/MEPS=3.40282e+38 1/(MEPS--)=inf
d: MEPS=5.56268e-309 1/MEPS=1.79769e+308 1/(MEPS--)=inf
e: MEPS=8.40526e-4933 1/MEPS=1.18973e+4932 1/(MEPS--)=inf