关于c++中数据sqrt() 精度问题

情景介绍

今天在做一个算法题目的时候,发现,当使用sqrt()方法进行开方的时候,一直存在提交不通过的情况。

问题分析

对数据不断分析后,发现对35进行开方后,仍然满足条件,这就存在问题。

sqrt(35) = 5.91608 

但是当我们运行以下代码的时候,却能够成立!

cout<< sqrt(35)*sqrt(35);//35

通过计算器计算和源码的分析发现问题所在!

在 C++ 中,sqrt 函数可以接受一个 double 类型的参数,并返回一个 double 类型的值。这意味着 sqrt 函数的精度是有限的,取决于 double 类型能够表示的精度。

所以当我们使用sqrt()来判断是否为整数的时候,会出现不准确的问题!!!

这时,我们需要一种新的方法来确定一个数开方后是否为整数,那就是floor()方法。

#include <cmath>  
#include <iostream>  
  
int main() {  
    double number;  
    std::cout << "请输入一个数:";  
    std::cin >> number;  
  
    double squareRoot = sqrt(number);  
    if (squareRoot == floor(squareRoot)) {  
        std::cout << "这个数的平方根是整数。" << std::endl;  
    } else {  
        std::cout << "这个数的平方根不是整数。" << std::endl;  
    }  
  
    return 0;  
}

在这个代码中,首先输入一个数。然后计算这个数的平方根,并使用 floor 函数将结果向下取整。如果取整后的平方根与原来的平方根相等,说明这个数的平方根是整数;否则,说明这个数的平方根不是整数。

那结合到我们这个问题当中,只需要将我们的sqrt(n)*sqrt(n)==n进行替换即可!

代码实现

#include<iostream>  
#include<cmath>  
#include <typeinfo>  
using namespace std;  
int main(){  
    int n;  
    cin>>n;  
    int total=0;  
      
    for(int i=1;i<sqrt(n);i++){  
        if(n%i==0&&n!=1){  
            total=total+2;  
            
        }  
    }  
    double squareRoot = sqrt(n);
    if(squareRoot == floor(squareRoot)){
        total++;  
    }  
    cout<<total;  
    return 0;  
}

最后效果

Verilog的平方根算法可以使用牛顿迭代法来实现。下面是一个使用牛顿迭代法计算平方根的Verilog代码示例: ```verilog module sqrt_calculator ( input wire [31:0] x, output reg [15:0] sqrt ); reg [15:0] next_sqrt; reg [47:0] diff; always @(x or sqrt) begin next_sqrt = sqrt; diff = (next_sqrt * next_sqrt) - x; if (diff > 0) begin next_sqrt = next_sqrt - 1; diff = (next_sqrt * next_sqrt) - x; end while (diff < 0) begin next_sqrt = next_sqrt + 1; diff = (next_sqrt * next_sqrt) - x; end sqrt = next_sqrt; end endmodule ``` 在这个示例,我们使用了一个输入端口 `x`,用于指定要计算平方根的数值。输出端口 `sqrt` 将给出计算得到的平方根值。 在 `always` 块,我们定义了一个迭代过程来逐步逼近平方根。首先,我们将当前的 `sqrt` 值赋给 `next_sqrt`。然后,我们计算 `next_sqrt` 的平方,并将其与输入值 `x` 进行比较,得到 `diff`。 如果 `diff` 大于零,则说明 `next_sqrt` 的平方超过了 `x`,需要将 `next_sqrt` 减一,以使其平方小于或等于 `x`。然后,我们再次计算新的 `diff` 值。 接下来,我们使用一个循环来逐步增加 `next_sqrt` 的值,直到 `diff` 大于或等于零为止。这样,我们就得到了最接近输入值 `x` 的平方根。 最后,我们将计算得到的平方根值赋给输出端口 `sqrt`。 请注意,这只是一个简单的示例,可能存在精度或性能方面的改进空间,具体实现取决于您的需求和资源限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要当前端工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值