#include <bits/stdc++.h>
using namespace std;
long long int GCD(long long int a, long long int b) {
  if (b == 0) return a;
  return GCD(b, a % b);
}
int main() {
  long long int k, d, t;
  double ans;
  cin >> k >> d >> t;
  double percentageLeft = 1.0;
  long long int currentTime = 0;
  double timeToCook = 0.0, nextRound;
  double percentageCookedOn, percentageCookedOff;
  if (GCD(k, d) == d) {
    timeToCook = t;
  } else {
    long double OneCycle = (long double)((long double)k / (long double)t);
    long double TRY =
        (long double)(((long double)(2 * k) + (long double)(d - (k % d))) /
                      (long double)(2 * t));
    OneCycle += (double)(d - (k % d)) / (double)(2 * t);
    long long int cycleTime = k + (d - (k % d));
    long long int noOfCompleteCycles =
        (long long int)((double)percentageLeft / (double)OneCycle);
    percentageLeft = (double)((double)percentageLeft -
                              (double)(noOfCompleteCycles) * (double)OneCycle);
    timeToCook = cycleTime * noOfCompleteCycles;
    while (percentageLeft > 0) {
      percentageCookedOn = (double)k / (double)t;
      double temp = percentageLeft;
      percentageLeft -= percentageCookedOn;
      if (percentageLeft == 0)
        break;
      else if (percentageLeft < 0) {
        timeToCook += (temp * t);
        break;
      } else {
        timeToCook += k;
      }
      percentageCookedOff = (double)(d - (k % d)) / (double)(2 * t);
      temp = percentageLeft;
      percentageLeft -= percentageCookedOff;
      if (percentageLeft == 0)
        break;
      else if (percentageLeft < 0) {
        timeToCook += (temp * t * 2);
        break;
      } else {
        timeToCook += (d - (k % d));
      }
    }
  }
  cout << fixed << setprecision(15) << timeToCook << endl;
  return 0;
}
