Ebay
Ebay

Reputation: 371

implement divide algorithm without using "/" for floating point

please if there is any specific algorithm for implementing the divide operator as a function, guide me about their name. I want to implement a function that takes two floating number and return the result of the divide, but in implementation, I won't use "/". I have done this in a much simpler version when we want just the q in integer,

function divide(num0, num1) {
  if ("bigint" != typeof num0 || "bigint" != typeof num1) {
    throw new TypeError("The arguments should be bigint.");
  }

  if (num1 > num0) {
    return 0;
  }

  for (var i = 0n; num0 >= num1; i++) {
    num0 -= num1;
  }

  return i;
}

"I use bigint numeric type just two restrict to integer"

but I think this approach couldn't extend two return floating results. my guess is I approach binary level operation or so; thanks if learning me about any flowchart, pseudo-code, or code-snippet "in any language" to deal with this problem

Upvotes: 0

Views: 58

Answers (1)

Ebay
Ebay

Reputation: 371

I wrote this one for this question in js:

function justIntegerDivide(num0, num1) {
  for (var q = 0; num0 >= num1; q++) {
    num0 -= num1;
  }

  return [q, num0];
}

const divide = (n0, n1, afterPoint = 10) => {
  if ((0 == n1 || 0n == n1) && 0 < n0) return Infinity;
  if ((0 == n1 || 0n == n1) && 0 > n0) return -Infinity;
  if ((0 == n1 || 0n == n1) && 0 == n0) return NaN;

  if ("number" == typeof n0 && "number" == typeof n1) {
    let sign = Math.sign(n0) * Math.sign(n1);
    let num0 = Math.abs(n0),
      num1 = Math.abs(n1);
    let counter = 0;
    let [q, r] = justIntegerDivide(num0, num1);

    result = `${q}.`;

    for (counter = 1; counter < afterPoint; counter++) {
      var newReminder;
      let qAfter;

      previousReminder = 1 == counter ? r : newReminder;

      [qAfter, newReminder] = justIntegerDivide(previousReminder * 10, num1);

      result += qAfter;

      if (0 == newReminder) {
        return +result * sign;
      }
    }

    return +result * sign;
  } else if ("bigint" == typeof n0 && "bigint" == typeof n1) {
    let sign = (n0 > 0 && n1 > 0) || (n0 < 0 && n1 < 0) ? 1n : -1n;
    let num0 = n0 > 0 ? n0 : -n0;
    let num1 = n1 > 0 ? n1 : -n1;

    if (num0 < num1) {
      return 0n;
    }

    for (var i = 0n; num0 >= num1; i++) {
      num0 -= num1;
    }

    return i * sign;
  } else {
    throw new TypeError("Both arguments should be number or bigint");
  }
};

Upvotes: 1

Related Questions