计算三次立方根

本文介绍了在腾讯后台开发面试中遇到的计算三次立方根的问题。通过二分法逼近目标值,解决单调性和精度问题。具体方法包括将数字转为正数,确定合适的上下界,并调整计算中间结果的方式,确保结果在指定误差范围内。
摘要由CSDN通过智能技术生成

背景

腾讯后台开发岗位的第三次面试中,面试官问到了如下的题目:

给定一个函数原型如下

float cubicRoot(float num, float maxRange) {
    
}

需要完成该函数,该函数的作用是计算一个浮点数的三次立方根,且结果需要满足maxRange这个范围的误差

思路

这个题目面试官其实考察的是使用二分的做法来逼近目标值,因为在[1,+∞)的范围内的话,f(x)=x^3是单调递增的,因此确立一个上下界,最简单就是以l = 0, r = targetNum为上下界,每次判断中间值的三次方与目标值的大小关系,从而判断接下来的步骤。

但是这样存在着以下的一些问题:

  1. 若目标值的范围在(-∞,0]这个范围,变成了单调递减函数
  2. 若目标值的范围在(-1,1)这个范围内的话,一个数字的立方根只会更加小
  3. 精度问题

针对这些问题,依次又有以下的解决方案:

  1. 将所有数字统一为正数处理,之后返回结果的时候再看目标数字如果是负数则返回一个负数结果,因为立方计算不会导致符号的变化
  2. [0,1)这个范围内的话,上下界确定为l = taregtNum, r = 1即可,其余不用变化
  3. 改用double计算中间结果

最终的代码以及测试代码如下:

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cassert>
using namespace std;

template<typename T>
T abs(T a) {
   
    if (a < 0) return -a;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值